7-52 数组元素循环右移问题(20 分)
一个数组 A A 中存有(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M M (≥0)个位置,即将中的数据由( A0A1⋯AN−1 A 0 A 1 ⋯ A N − 1 )变换为( AN−M⋯AN−1A0A1⋯AN−M−1 A N − M ⋯ A N − 1 A 0 A 1 ⋯ A N − M − 1 )(最后 M M 个数循环移至最前面的个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入 N N (1≤≤100)和 M M (≥0);第2行输入个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移 M M <script type="math/tex" id="MathJax-Element-566">M</script>位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
#include <stdio.h>
#define MAXN 100
int main(void) {
int n, m, num[MAXN * 2], i, temp;
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
m %= n;
for (i = n + m - 1; i > m - 1; i--) {
num[i] = num[i - m];
}
for (i = 0; i <= m - 1; i++) {
num[i] = num[n + i];
}
for (i = 0; i < n; i++) {
if (i == 0) {
printf("%d", num[i]);
}
else {
printf(" %d", num[i]);
}
}
printf("\n");
return 0;
}