题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数。
#include <stdio.h>
#define swap(a,b) a^=b,b^=a,a^=b
void fun(int *arr,int n,int m){
int i,j;
if(m>0&&m<n){
for(i=0,j=n-1;i<j;i++,j--) //全部倒序
swap(arr[i],arr[j]);
for(i=0,j=m-1;i<j;i++,j--) //前 m 个数倒序
swap(arr[i],arr[j]);
for(i=m,j=n-1;i<j;i++,j--) //后 n-m 个数倒序
swap(arr[i],arr[j]);
}
}
int main(){
int i,arr[10]={0,1,2,3,4,5,6,7,8,9};
int n=10,m=3; // n:数组元素个数 m:后移次数
if(m>n) m%=n; // m>n时转换为等价的小于 n 的数
fun(arr,10,3);
/* 仅打印输出 ,未真正元素后移。
int k=(n-m)%n;
for(i=0;i<n;i++){
printf("%d ",arr[k]);
k=(k+1)%n;
}
*/
for(i=0;i<10;i++) printf("%d ",arr[i]);
return 0;
}