0001 void shift1(int* A, int n, int m) { //0<m<n 0002 int d = std::gcd(n,m); //最大公约数,即轮换的总数 0003 for (int i = 0; i < d; i++) { //对于每个起始于i、间距为m的轮换 0004 int X = A[i]; int t = (n-m+i)%n; //备份首元素,标记终点 0005 for (int j = i, k = (j+m)%n; j != t; j = k, k = (k+m)%n) 0006 A[j] = A[k]; //n/d-1个元素依次前移m个单位 0007 A[t] = X; //首元素就位 0008 } 0009 } //shift1:n+d次移动