C语言用指针实现:有n个整数(n≤20),使前面各数顺序向右移动m(m≤n)个位置,最后m个数变成最前面m个数。写一函数实现以上右移功能,在主函数中完成输入和输出。 输入 先输入整数个数n(n≤20)。 再输入这n个整数,输入时用空格间隔。 最后输入要右移的偏移量m(m≤n)。 输出 移动后的n个整数。注意:末数的右边不输出空格。
时间: 2024-02-25 16:58:45 浏览: 87
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.
好的,这是一个经典的数组右移问题,下面给出一个使用指针实现的C语言函数:
```c
void right_shift(int *arr, int n, int m) {
m %= n;
if (m == 0) {
return;
}
int *p = arr + n - 1;
int *q = arr + n - m - 1;
int *tmp = (int*)malloc(m * sizeof(int));
memcpy(tmp, p - m + 1, m * sizeof(int));
while (p > q) {
memcpy(p, p - m, m * sizeof(int));
p -= m;
}
memcpy(arr, tmp, m * sizeof(int));
free(tmp);
}
```
这个函数接受一个整数数组 `arr`,数组大小为 `n`,要求右移的偏移量为 `m`。函数先对 `m` 取模,然后判断如果 `m` 等于 0,直接返回不做处理。
接下来,定义两个指针 `p` 和 `q`,分别指向数组 `arr` 的最后一个元素和倒数第 `m+1` 个元素,即要移动到最前面的元素的前一个位置。再定义一个临时数组 `tmp`,用于存储要移动到最前面的 `m` 个元素。
接下来的操作是,将数组最后面的 `m` 个元素复制到临时数组 `tmp` 中,然后从后往前遍历数组 `arr`,每次将 `p` 指向的 `m` 个元素向右移动 `m` 个位置,直到 `p` 的位置移动到 `q` 的位置。最后,将临时数组 `tmp` 中的元素复制回数组 `arr` 的最前面 `m` 个位置。
在主函数中,可以按照以下方式调用该函数:
```c
int main() {
int n, m;
scanf("%d", &n);
int *arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &m);
right_shift(arr, n, m);
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
if (i < n - 1) {
printf(" ");
}
}
free(arr);
return 0;
}
```
在主函数中,先输入整数个数 `n`,然后输入数组 `arr` 的 `n` 个元素,再输入要右移的偏移量 `m`。然后调用 `right_shift` 函数对数组进行右移操作,最后输出右移后的数组。
阅读全文