一、需求
- 本题要求实现一个对数组进行循环右移的简单函数;
- 一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置;
- 即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
- 函数接口定义如下
int ArrayShift( int a[], int n, int m );
- 其中
a[]
是用户传入的数组;n
是数组的大小;m
是右移的位数。函数ArrayShift
须将循环右移后的数组仍然存在a[]
中。
二、裁判程序样例
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
三、测试样例
- 输入样例
6 2
1 2 3 4 5 6
- 输出样例
5 6 1 2 3 4
四、我的思路
- 受到练习8-8的启发,利用取余实现数组元素的平移;
- 移动次数m可能大于数组长度n,这个时候直接取余,使得m<=n;
- 像练习8-8一样,定义一个整型数组,下面就是找规律了:
代码是这样的:
int ArrayShift( int a[], int n, int m ) {
int s[n];
m = m % n;
for(int i = n - 1; i >= 0; i--) {
s[i] = a[(i - m + n) % n];
}
for(int i = 0; i < n; i++) {
a[i] = s[i];
}
}