0001 int shift ( int* A, int n, int s, int k ) { //从A[s]出发,以k为间隔循环左移,O(n / GCD(n, k)) 0002 int bak = A[s]; //备份起始元素 0003 int i = s, j = ( s + k ) % n; //从该元素出发 0004 int mov = 0; //移动次数 0005 while ( s != j ) { //以k为间隔 0006 A[i] = A[j]; //依次左移k位 0007 i = j; j = ( j + k ) % n; mov++; 0008 } 0009 A[i] = bak; //将起始元素转入对应位置 0010 return mov + 1; 0011 }