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


    原题的意思是给定一个指定长度的数组,然后接受一个数字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 }    

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

  • 相关阅读:
    BZOJ 1096: [ZJOI2007]仓库建设 动态规划 + 斜率优化
    CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
    BZOJ 3879: SvT 虚树 + 后缀自动机
    CF613D Kingdom and its Cities 虚树 + 树形DP
    luogu P4103 [HEOI2014]大工程 虚树 + 树形 DP
    BZOJ 2286: [Sdoi2011]消耗战 虚树
    组合数学入门
    对于下发的文件进行爬取,减少人去下载的过程
    写了个爬虫代理ip的脚本给大家使用
    文本属性,边界圆角,背景属性,精灵图案例
  • 原文地址:https://www.cnblogs.com/kingos/p/4504789.html
Copyright © 2020-2023  润新知