6-5 数组循环左移 分数 30 作者 王群芳 单位 合肥师范学院 本题要求实现一个对数组进行循环左移的函数:一个数组a中存有n(>0)个整数,将每个整数循环向左移m(≥0)个位置。即将a中的数据由[a 0 a 1 ...a n−1 ]变换为[a m a m+1 ...a n−1 a 0 a 1 ...a m−1 ](最前m个数循环移至最后面的m个位置)。 函数接口定义: void ArrayShift( int a[], int n, int m ); 其中a[]是用户传入的数组;n是数组的大小;m是左移的位数。函数ArrayShift须将循环左移后的数组元素仍然存放在a[]中。 裁判测试程序样例: #include <stdio.h> #define MAXN 20 void 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; } /* 你的代码将被嵌在这里 */
时间: 2024-03-25 12:37:17 浏览: 92
以下是实现循环左移的函数ArrayShift:
```c
void ArrayShift(int a[], int n, int m) {
m %= n; // 防止 m 大于 n
int temp[m]; // 用于存储前 m 个数
for (int i = 0; i < m; i++) {
temp[i] = a[i];
}
for (int i = m; i < n; i++) {
a[i - m] = a[i];
}
for (int i = n - m; i < n; i++) {
a[i] = temp[i - n + m];
}
}
```
首先,我们对 m 取模,防止 m 大于 n。然后,我们用一个临时数组 temp 存储数组中前 m 个数。接着,我们将数组中的后 n-m 个数往前移 m 个位置,将前 m 个数移到数组末尾。最后,我们将 temp 中的数复制回数组最后 m 个位置。
完整代码如下:
```c
#include <stdio.h>
#define MAXN 20
void 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;
}
void ArrayShift(int a[], int n, int m) {
m %= n; // 防止 m 大于 n
int temp[m]; // 用于存储前 m 个数
for (int i = 0; i < m; i++) {
temp[i] = a[i];
}
for (int i = m; i < n; i++) {
a[i - m] = a[i];
}
for (int i = n - m; i < n; i++) {
a[i] = temp[i - n + m];
}
}
```
阅读全文