同樣,寫給自己,以前只會再開一個數組和暴力右移,這次學到了新的方法,記錄一下。
有數組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;
}