码迷,mamicode.com
首页 > 其他好文 > 详细

给定一列数字将其平移n位

时间:2015-05-15 01:06:15      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

原题的意思是给定一个指定长度的数组,然后接受一个数字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("\n请输入后移的位数");
 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("\n输入后移的位数");
 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("\n请输入后移的位数");
 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 }    

今天就先写这四种方法,能找到其他的还会继续添加,如果大家有什么比较好的方法,也可以交流下。

 

给定一列数字将其平移n位

标签:

原文地址:http://www.cnblogs.com/kingos/p/4504789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!