0001 void shift2(int* A, int n, int m) { //0<m<n 0002 int d = std::gcd(n,m); //最大公约数,即轮换的总数 0003 int* X = new int[d]; //使用一个短数组(O(d)辅助空间,严格地说并非就地算法) 0004 for (int k = 0; k < d; k++) //来备份所有轮换的 0005 X[k] = A[k]; //首元素 0006 for (int i = 0; i != n-m; i = (i+m)%n) //d个轮换并行地 0007 for (int j = i, k = (j+m)%n; j != (i+d)%n; j = (j+1)%n, k = (k+1)%n) //做n/d-1次 0008 A[j] = A[k]; //前移 0009 for (int k = 0; k < d; k++) //所有轮换的首元素 0010 A[n-m+k] = X[k]; //就位 0011 delete[] X; 0012 } //shift2:n+d次移动