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 }