本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3
1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
程序代码
#include<stdio.h>
int main(){
int shu[101];
int n; //n定义数组内元素个数
int m; //m决定数组循环左移次数
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){ //输入数组内n个元素的值
scanf("%d",&shu[i]);
}
if(n==1){ //如果数组内只有一个元素时,则数组不发生左移
printf("%d",shu[0]);
return 0;
}
//当数组循环左移次数大于元素个数时
//数组会发生重复左移
int yu = m%n; //进行取余除去重复左移的部分
if(yu == 0){ //当m为n的整数倍数时,数组元素左移回到起始位置
for(int j=0;j<n;j++){ //只需要将数组元素按原顺序输出
printf("%d",shu[j]);
if(j<n-1) //每输出一个数后面接一个空格,直到最后一个数
printf(" ");
}
return 0; //结束程序,防止程序往下运行
}
if(n>yu){ //当数组发生左移时
//因为数组的元素左移是所有数一起移动
//可以将左移的次数作为分割点将数组分成两部分
//一部分为前移的数组元素,另一部分为前移没空间而移到数组尾部的数
for(int i=yu;i<n;i++){ //左移yu次时,下标为yu的元素作为数组第一个元素
printf("%d ",shu[i]);//所以先输出左移后数组头的元素
}
for(int j=0;j<yu;j++){ //下标小于yu的元素都移动到了数组尾部
printf("%d",shu[j]);//输出左移后数组尾的元素
if(j<yu-1)
printf(" ");
}
}
return 0;
}