6-2 数组循环左移 分数 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; } /* 你的代码将被嵌在这里 */ 输入样例: 6 2 1 2 3 4 5 6 输出样例: 3 4 5 6 1 2 输入样例: 5 6 1 2 3 4 5 输出样例: 2 3 4 5 1
时间: 2024-03-25 20:41:10 浏览: 53
根据题目要求,我们需要编写一个实现数组循环左移的函数 `ArrayShift`。具体实现思路如下:
1. 首先,我们需要将前 `m` 个元素存储到一个临时数组 `temp` 中,以便后面将它们移动到数组的结尾。
2. 然后,我们需要将数组中的元素往前移动 `m` 个位置,以让前 `m` 个元素空出位置。
3. 最后,我们需要将临时数组 `temp` 中的元素移动到数组的结尾,以完成循环左移的操作。
根据以上思路,我们可以编写如下代码实现所需功能:
```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) {
int i, temp[m];
for (i = 0; i < m; i++) {
temp[i] = a[i]; // 将前 m 个元素存储到 temp 数组中
}
for (i = m; i < n; i++) {
a[i - m] = a[i]; // 将数组中的元素往前移动 m 个位置
}
for (i = 0; i < m; i++) {
a[n - m + i] = temp[i]; // 将 temp 数组中的元素移动到数组的结尾
}
}
```
在这段代码中,我们首先定义了一个 `ArrayShift` 函数,用于实现数组的循环左移。该函数接收一个整数数组 `a`、数组大小 `n` 和左移的位数 `m` 作为参数。在函数中,我们创建了一个临时数组 `temp`,用于存储前 `m` 个元素,然后将数组中的元素往前移动 `m` 个位置,最后将 `temp` 数组中的元素移动到数组的结尾,以完成循环左移的操作。
在 `main` 函数中,我们首先读入数组大小 `n` 和左移的位数 `m`,然后使用一个 `for` 循环读取数组中的元素,并将其保存在 `a` 数组中。最后,我们调用 `ArrayShift` 函数对数组进行循环左移,并输出移动后的数组元素。
输入样例:
```
6 2
1 2 3 4 5 6
```
输出样例:
```
3 4 5 6 1 2
```
输入样例:
```
5 6
1 2 3 4 5
```
输出样例:
```
2 3 4 5 1
```
阅读全文