一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A?0??A?1???A?N?1??)变换为(A?N?M???A?N?1??A?0??A?1???A?N?M?1??)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
每个输入包含一个测试用例,第1行输入N(1)和M(≥);第2行输入N个整数,之间用空格分隔。
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
6 2
1 2 3 4 5 6
5 6 1 2 3 4
数组元素循环右移
1.核心算法 n个元素循环右移m位时, 三步走 (1).翻转前n-m项 (2).翻转后m项 (3).翻转所有元素 来源自《数据结构》--严蔚敏老师 链表章节
2.细节需要注意的地方
2.1 M大于0,M大于N时要取余
2.2 结尾数字不带空格,要单独输出
1 #include "stdio.h" 2 #include "stdlib.h" 3 int reverse(int *a,int left,int right){ 4 int temp; 5 while(left<right){ 6 temp=a[left]; 7 a[left++]=a[right]; 8 a[right--]=temp; 9 } 10 return 0; 11 } 12 int main(){ 13 int i,n,m; 14 scanf("%d %d",&n,&m); 15 int arr[n]; 16 m=m>n?m%n:m; 17 for(i=0;i<n;i++){ 18 scanf("%d",&arr[i]); 19 } 20 reverse(arr,0,n-m-1); 21 reverse(arr,n-m,n-1); 22 reverse(arr,0,n-1); 23 24 for(i=0;i<n-1;i++){ 25 printf("%d ",arr[i]); 26 } 27 printf("%d\n",arr[i]); 28 return 0; 29 }
PTA basic 1008 数组元素循环右移问题 (20 分) c语言实现(gcc)
原文:https://www.cnblogs.com/ichiha/p/14675152.html