题目描述:
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?P15页学习实验指导书
方法仅给出实验思考题方法:
#include<stdio.h>
int Gcd(int ,int);
int main()
{
int m,n;
scanf("%d %d",&n,&m);
int a[n];
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
if(m!=0)
{
int loop=Gcd(m,n); /*求出循环圈数*/
m%=n;/*求出实际移动数量*/
int tempt;
int start;
for (int p=0;p<loop;p++)
{
start=p;
tempt=a[start];
for (int j=1;j<(n/loop);j++)
{
a[start]=a[(start+m)%n];
start=(start+m)%n;
}
a[(p-m+n)%n]=tempt;
}
}
if (n>1)
{
for (int j=0;j<n-1;j++)
{
printf("%d ",a[j]);
}
printf("%d",a[n-1]);
}
else
printf("%d",a[0]);
}
int Gcd(int a,int b)
{
if(a > b)
{
if(a % b == 0)
{
return b;
}
else
{
return Gcd(b,a%b);
}
}
else
{
if(b % a == 0)
{
return a;
}
else
{
return Gcd(a,b%a);
}
}
}
易错点:
没有设置loop,不止一个圈
出现浮点错误,以及输出错误,集中在m=0和n=1的情况下,也就是被除数为0