Pearls第二章

16081 ワード

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 

  4 int testArray[256];    // 

  5 int length=0;        // 

  6 int rotateCount;    // 

  7 

  8 int gcd(int m,int n);

  9 int gcd2(int i,int j);

 10 

 11 void rotate();        // 

 12 void rotate2();        // 

 13 void rotate3();        // :    , 

 14 

 15 void rotate()

 16 {

 17     int i,j,k,t;

 18     for (i=0;i<gcd2(length,rotateCount);i++)

 19     {

 20         t=testArray[i];

 21         j=i;

 22         while (1)

 23         {

 24             k=j+rotateCount;

 25             if(k>=length)

 26                 k-=length;

 27             if(k==i)

 28                 break;

 29             testArray[j]=testArray[k];

 30             j=k;

 31         }

 32         testArray[j]=t;

 33     }

 34 }

 35 

 36 int gcd(int m,int n)

 37 {

 38     int m_temp=m,n_temp=n,res;

 39     res=m_temp%n_temp;

 40     while (res!=0)

 41     {

 42         m_temp=n_temp;

 43         n_temp=res;

 44         res=m_temp%n_temp;

 45     }

 46     return n_temp;

 47 }

 48 

 49 int gcd2(int i,int j)

 50 {

 51     while (i!=j)

 52     {

 53         if(i>j)

 54             i-=j;

 55         else

 56             j-=i;

 57     }

 58     return i;

 59 }

 60 

 61 int main()

 62 {

 63     int temp;

 64     int i=0;

 65     printf("------ , -1 :-------
"); 66 while (scanf("%d",&temp)&&temp!=-1) 67 { 68 testArray[i++]=temp; 69 length++; 70 } 71 printf("------ :------
"); 72 scanf("%d",&rotateCount); 73 74 75 rotate2(); 76 printf("--------- :---------
"); 77 78 for (i=0;i<length;i++) 79 { 80 printf("%-4d ",testArray[i]); 81 } 82 printf("
"); 83 84 return EXIT_SUCCESS; 85 } 86 87 void inverseArray(int array[],int size) 88 { 89 int i=0,j=size-1,temp; 90 while (i<j) 91 { 92 temp=array[i]; 93 array[i]=array[j]; 94 array[j]=temp; 95 i++; 96 j--; 97 } 98 } 99 100 void rotate3() 101 { 102 inverseArray(testArray,rotateCount); 103 inverseArray(testArray+rotateCount,length-rotateCount); 104 inverseArray(testArray,length); 105 } 106 107 void swapArray(int a[],int b[],int m) 108 { 109 int i,temp; 110 for (i=0;i<m;i++) 111 { 112 temp=a[i]; 113 a[i]=b[i]; 114 b[i]=temp; 115 } 116 } 117 118 void rotate2() 119 { 120 int i,j,p; 121 if(rotateCount==0&&rotateCount==length) 122 return; 123 i=p=rotateCount; 124 j=length-p; 125 126 while (i!=j) 127 { 128 if(i>j) 129 { 130 swapArray(testArray+p-i,testArray+p,j); 131 i-=j; 132 }else 133 { 134 swapArray(testArray+p-i,testArray+p+j-i,i); 135 j-=i; 136 } 137 } 138 }