同样,写给自己,以前只会再开一个数组和暴力右移,这次学到了新的方法,记录一下。
有数组123456,要右移两次,可以分成1234和56两块,两块都左右交换,变成4321和65,432165再左右交换即可变成561234(这步可以省略,直接在432165的情况下写两个for,从N-M~N和1~N-M-1输出)。
证明(有错欢迎指出)
设一个数组总共有N个数,要右移M位,有元素a,且a的下标为i。那么a最终位于i+M。
首先,将这个数组分为0~(N-M-1)和(N-M)~N-1两块,在前半块时,先左右交换,i就变为N-M-1-i,再两块整体进行左右交换,i变为N-(N-M-1-i)-1=M+i。
C
#include <stdio.h>
#pragma warning(disable:4996)
void reverse(int *a,int start,int end)
{
for(;start<end;start++,end--)
{
a[start]^=a[end]; //一个交换数字的方法,证明请问度娘
a[end]^=a[start];
a[start]^=a[end];
}
}
int main(void)
{
int n,m,i,a[100];
scanf("%d %d",&n,&m);
m%=n;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
reverse(a,0,n-m-1);
reverse(a,n-m,n-1);
reverse(a,0,n-1);
for(i=0;i<n;i++)
printf(i==0?"%d":" %d",a[i]); //数组的最后不能有多于空格
return 0;
}