PAT B1008 数组元素循环右移问题

PAT B1008 数组元素循环右移问题

这是一道关于gcd的题目,还是需要仔细感受一下gcd中间代码的简洁与巧妙
要注意算法的优化,使得移动次数减少了gcd(n,m)倍
代码如下

#include<cstdio>

//最大公约数
int gcd(int a,int b){
    if(b==0) return a;
    else return gcd(b,a%b);
}

int main(){
    int a[110];
    int n,m,temp,pos,next;
    //temp 临时变量 pos 当前位置 next 下一个准备处理的位置
    scanf("%d %d",&n,&m);
    for(int i = 0;i < n;i++){
        scanf("%d",a+i);
    }
    m = m % n ;//修正m
    if(m){
        int d = gcd(n,m);
        for(int i = n-m;i < n-m+d;i++){
            temp = a[i];
            pos = i;
            do{
                //计算next
                next = (pos -m + n)%n;
                //如果下个位置不是初始点
                if(next!=i) a[pos] = a[next];
                else a[pos] = temp;
                pos = next;
            }while(pos!=i);
        }
    }
    for(int i = 0 ; i < n ;i ++){
        printf("%d",a[i]);
        if(i < n-1) printf(" ");
    }
    return 0 ;
}