Pearls 第二章

  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结束:-------\n");
 66     while (scanf("%d",&temp)&&temp!=-1)
 67     {
 68         testArray[i++]=temp;
 69         length++;
 70     }
 71     printf("------请输入旋转的位数:------\n");
 72     scanf("%d",&rotateCount);
 73 
 74 
 75     rotate2();
 76     printf("---------旋转之后的数组元素为:---------\n");
 77     
 78     for (i=0;i<length;i++)
 79     {
 80         printf("%-4d    ",testArray[i]);
 81     }
 82     printf("\n");
 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 }

posted on 2012-06-05 09:30  一指流砂  阅读(223)  评论(0编辑  收藏  举报

导航