• 打印1到最大的n位数


    转载:http://blog.csdn.net/jxh_123/article/details/38364923?utm_source=tuicool&utm_medium=referral

    题目描述:

      输入数字n,按顺序打印出从1最大的n位十进制数。例如输入3,则打印出1,2,3一直到最大的3位数即999.

    这里需要注意,本题是核心考察的大数问题,就是怎么存一个很大的数,我们用的是数组进行存储。我们需要考虑下面的问题:

     1.如何表示一个n位数?(用字符数组)
     2.每次加1都在最低位进行;
     3.加1后若发生进位,则将该进位传播给高位数字(这里既可用循环,也可用递归);
     4.若最高位发生进位,则溢出,该溢出可作为打印最后一个数的标志;
     5.打印数字时,只能从最高位不为0的数字起开始打印。(这符合数字的正常表示)
     
    算法实现:
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 bool Increment(char * str)//用于将当前字符串对应的数字加1,返回true表示增加成功
     6 {
     7   int len = strlen(str);
     8   int current = str[len - 1] - '0' + 1;//将个位数字加1,current表示加1后的值
     9   int i = len - 1;//下面开始传播个位加1后的连锁进位反应
    10   
    11   while(i >= 0)//用i表示当前位
    12   {
    13     if(current < 10)//若加1后不进位
    14     {
    15       str[i] = str[i] + 1;
    16       break;
    17     }
    18     else//如果当前位发生进位
    19     {
    20       if(i == 0)//如果进位的是最高位,则直接发生溢出
    21       {
    22         return false;
    23       }
    24       else//如果进位的不是最高位,这里能保证i!=0,因为上面有个为0的分支处理
    25       {
    26         str[i] = '0';//先将本位归零
    27         i = i - 1;//开始处理本位的上一位
    28         current = str[i] - '0' + 1;
    29       }
    30     }
    31   }
    32   return true;
    33 }
    34 
    35 void print(char *str)//显示该数字
    36 {
    37   bool begin = false;
    38   int i;
    39   int len = strlen(str);
    40   for(i = 0; i < len; i++)
    41   {
    42     if(!begin && str[i] != '0')
    43     {
    44       begin = true;
    45     }
    46     if(begin)//如果已经找到第一个非0的高位数字
    47     {
    48       cout<<str[i];
    49     }
    50   }
    51   cout<<endl;
    52 }
    53 
    54 void ToMaxN(int n)//客户端调用的函数
    55 {
    56   char *str = new char[n + 1];
    57   memset(str, '0', n);//注意初值在中间,不是第三个参数
    58   str[n] = '';
    59   while(Increment(str))
    60   {
    61     print(str);
    62   }
    63   delete [] str;
    64 }
    65 
    66 int main()
    67 {
    68   int n;
    69   while(cin>>n)
    70   {
    71     if(n >= 1 && n <= 5)
    72     {
    73       ToMaxN(n);
    74     }
    75   }
    76   return 0;
    77 }
  • 相关阅读:
    LinuxMySQL主从复制原理图
    flask中间件请求流程
    flask02
    flask01
    笔记本电脑播放声音前后会有吱吱声
    筛法欧拉函数
    矩阵快速幂
    最短路 P1144 最短路计数【Dijkstra堆优化/SPFA】
    SPFA算法以及负环判断【模板】
    最短路 P1629 邮递员送信 【反向图求最短路】
  • 原文地址:https://www.cnblogs.com/dormant/p/5329574.html
Copyright © 2020-2023  润新知