第一眼看见这个题其实是想用拼接两个数组来实现,不过思考之后发现用%这个东东会很简洁明了。
老规矩,先讲思路:
关于怎么用这个%;你只要在纸上算几对数就会发现规律。
题目的意思即:把后m个元素挪到前面,前n-m个元素挪到后面。
假如有5个元素要循环移动3个位置:
1 2 3 4 5 ——————>3 4 5 1 2
显而易见 第一个元素变成第1+3个,第二个元素变成第2+3个,第三个元素变成第1个,即(3+3)%5,第四个元素变成第2个,即(4+3)%5,第五个元素变成第3个,即(5+3)%5;
所以思路就很明显了:
创建一个新数组,把原数组的元素按照i--(i+m)%n的规律拷贝,
最后再把新数组整个拷贝给原数组。即可。
代码实现:
#include<stdio.h>
void mov(int* x,int n,int m)
{
int *y = x ,temp[11] = {0};
for(int i=0;i<n;i++)
temp[(i+m)%n] = y[i];
for(int i=0;i<n;i++)
x[i] = temp[i];
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int x[n];
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
mov(x,n,m);
printf("After move: ");
for(int i=0;i<n;i++)
printf("%d",x[i]);
return 0;
}
俺觉得这样省去了什么俩数组拼接呀啥的,就很简洁。
下课~