【题目】有一个整数数组,现要求实现这个整数数组的循环右移。如:1,2,3,4,5 则循环右移两位后结果是:4,5,1,2,3。
//这个做法主要是执行3次倒序,相比于执行N次M个数右移一位效率高一点点,但是也不是最好的做法。相对好理解一点。
#include <stdio.h>
#include <stdlib.h>
#define swap(a,b) a^=b,b^=a,a^=b
void RightShift(int *Array,int N,int M)
{
int i,j;
if(M > 0 && M <N){
for (i = 0,j = N-1;i < j; i++,j--)//全部倒序
swap(Array[i],Array[j]);
for (i = 0,j = M-1;i < j; i++,j--)//前M个数倒序
swap(Array[i],Array[j]);
for (i = M,j = N-1;i < j; i++,j--)//后N-M个数倒序
swap(Array[i],Array[j]);
}
}
int main()
{
int number[100],M,N;
int i;
scanf("%d%d",&N,&M);
for (i = 0;i < N ;i++)
scanf("%d",&number[i]);
M %= N; //M>N时转换为等价的小于N的数
RightShift(number,N,M);
for(i = 0 ;i < N - 1;i++)
printf("%d ",number[i]);
printf("%d\n",number[N-1]);
return 0;
}