原题的意思是给定一个指定长度的数组,然后接受一个数字m,将原数组前m位移动到最后,且顺序不变。
看到这个题,想到的第一个方法就是在用一个数组来储存改变后的数字,代码如下
1 int func(){ 2 int i,j,n; 3 int b[10]; //定义一个新数组用来储存改变后的数字 4 int a[]={0,1,2,3,4,5,6,7,8,9}; 5 printf("请输入要后移的位数"); 6 scanf("%d",&n); 7 for(i=n,j=0;i<10;i++,j++) //把原数组n位后的数放到新数组最前面 8 b[j]=a[i]; 9 for(i=0;i<n;i++,j++) //将原数组前n位接着放到新数组中 10 b[j]=a[i]; 11 for(i=0;i<10;i++) 12 { 13 printf("%d ",b[i]); 14 } 15 return 0; 16 }
然后看题意好像是不允许用另外一个数组,接着就有了下一种思路,每次把原数组最后一个数放到最前面,循环数组长度(len)-n次,代码如下:
1 void func() 2 { 3 int temp,i,j,n; 4 int a[]={0,1,2,3,4,5,6,7,8,9}; 5 printf(" 请输入后移的位数"); 6 scanf("%d",&n); 7 n=10-n; 8 for(i=0;i<n;i++) //循环n次把原数组后n位放到最前 9 { 10 j=9; 11 temp=a[j]; //每次记录原数组最后一个数字 12 for(;j>0;j--) 13 { 14 a[j]=a[j-1]; //把整个数组后移一位 15 } 16 a[j]=temp; //把最后一个数放到最前 17 } 18 for(i=0;i<10;i++) 19 { 20 printf("%d ",a[i]); 21 } 22 }
这样一个程序感觉看的很头疼,然后自己就在网上又找到了一种''偷懒''的方法, 这种方法的思路是只按后移之后的顺序输出原数组,代码如下:
1 void func() 2 { 3 int i,k,n; 4 int a[]={0,1,2,3,4,5,6,7,8,9}; 5 printf(" 输入后移的位数"); 6 scanf("%d",&n); 7 for(i=0;i<10;i++) 8 { 9 k=(i+n)%10; //求后移之后的下标 10 printf("%d ",a[k]); //直接输出该数字 11 } 12 }
感觉这个题的解决方法很多,然后就又在搜了下,又找到了一种方法,这种方法的思路是先分别将m位之前和之后的数字反转,最后将整个数组反转,代码贴下:
1 void fun() 2 { 3 int i,j,n,temp; 4 int a[]={0,1,2,3,4,5,6,7,8,9}; 5 printf(" 请输入后移的位数"); 6 scanf("%d",&n); 7 for(i=0,j=n-1;i<n/2;i++,j--) //将n位之前的数字反转 8 { 9 temp=a[i]; 10 a[i]=a[j]; 11 a[j]=temp; 12 } 13 for(i=n,j=9;i<(n+10)/2;i++,j--) //将n位之后的数字反转 14 { 15 temp=a[i]; 16 a[i]=a[j]; 17 a[j]=temp; 18 } 19 for(i=0,j=9;i<5;i++,j--) //将整个数组反转 20 { 21 temp=a[i]; 22 a[i]=a[j]; 23 a[j]=temp; 24 } 25 /*上面这三个循环可以写成一个函数*/ 26 for(i=0;i<10;i++) 27 { 28 printf("%d ",a[i]); 29 } 30 31 }
今天就先写这四种方法,能找到其他的还会继续添加,如果大家有什么比较好的方法,也可以交流下。