打印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] = '\0';
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 }

 

posted @ 2016-03-28 16:38  Dormant  阅读(254)  评论(0编辑  收藏  举报