zoukankan      html  css  js  c++  java
  • 打印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 }
  • 相关阅读:
    组装query,query汇总,query字段
    POJ 1276, Cash Machine
    POJ 1129, Channel Allocation
    POJ 2531, Network Saboteur
    POJ 1837, Balance
    POJ 3278, Catch That Cow
    POJ 2676, Sudoku
    POJ 3126, Prime Path
    POJ 3414, Pots
    POJ 1426, Find The Multiple
  • 原文地址:https://www.cnblogs.com/dormant/p/5329574.html
Copyright © 2011-2022 走看看