题目描述:
编写一个函数ArrayShift( int arr[], int n, int m),该函数将数组arr中每个元
素循环向右移m个位置。
如图所示
#include <stdio.h>
#define MAXN 10
int ArrayShift(int arr[], 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;
}
int ArrayShift(int arr[], int n, int m) {
int i, j;
m = m % n;
int temp[100];
for (j = 0; j < n; j++) {
temp[j] = arr[j];
}
for (i = 0; i < n; i++) {
if (i >= (n - m)) {
arr[i + m - n] = temp[i];
}
else {
arr[i + m] = temp[i];
}
}
}
右移的思路:
首先移动次数对数组大小进行求余,只需要移动余数次即可。比如数组大小10,移动11,那么实际移动1个位置即可
其次,将右侧需要移动数量的元素复制到新数组,然后将左侧剩余元素全部右移指定数量的位置
最后,将复制的右侧数组逐个复制到数组左侧即可
#include <stdio.h>
void ArrayShift( int arr[], int n, int m)
{
int i=0,temp[100];
m = m%n;
for(i=0;i<m;i++)
temp[i] = arr[n-m+i];
for(i=n-1;i>=m;i--)
arr[i] = arr[i-m];
for(i=0;i<m;i++)
arr[i] = temp[i];
}
int main()
{
int m,n,i,arr[100];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
ArrayShift(arr,n,m);
for(i=0;i<n;i++)
printf("%d ",arr[i]);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!