打印1到最大的n位数

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

 1 /* 解法1:
 2     此题应该注意大数的情况。
 3     因此用字符串来模拟大数。
 4     具体思路:首先把字符串的每一个数字都初始化为‘0’,
 5     然后每一次为字符串表示的数字加1,    在打印出来。
 6     即:1、在字符串表示的数字上模拟加法;Increment(n)
 7         2、把字符串表示的数字打印出来。PrintNumber(n)
 8 */
 9 #include <iostream>
10 using namespace std;
11 
12 void PrintNumber(char* n){
13     int len = strlen(n);
14     int i = 0;
15     while( i < len && n[i] == '0' )    // 不打印前导0
16         i++;
17     bool flag = false;
18     while(i < len){
19         cout << n[i++];
20         flag = true;
21     }
22     if (flag)        // 保证当数字为0时,不输出空格
23         cout << endl;
24 }
25 
26 bool Increment(char* n){
27     bool isOverflow = false;
28     int len = strlen(n);
29     int carry = 0;
30     for (int i = len-1; i >= 0; i--){
31         int nSum = n[i] - '0' + carry;
32         if (i == len-1)
33             nSum++;
34         if (nSum >= 10){
35             if (i == 0)
36                 isOverflow = true;
37             else{
38                 nSum -= 10;
39                 carry = 1;
40                 n[i] = '0' + nSum;
41             }
42         }
43         else{    // 无需再进位
44             n[i] = '0' + nSum;
45             break;
46         }
47     }
48     return isOverflow;
49 }
50 
51 void Print1ToMaxOfNDigits(int n){
52     if (n <= 0)
53         return;
54     char *number = new char[n+1];
55     memset(number, '0', n);
56     number[n] = '\0';
57 
58     while(!Increment(number))    // number+1
59         PrintNumber(number);    // 打印number
60     delete []number;
61 }
62 
63 int main(){
64     Print1ToMaxOfNDigits(2);
65     return 0;
66 }

 

 1 /* 解法2:
 2     解法1的代码相对较长。可以换一种思路来考虑该问题。
 3     如果在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。
 4     即,把数字的每一位都从0~9排列一边,就得到所有的十进制数。
 5     只是在打印时,数字排在前面的0不打印出来而已。
 6 */
 7 #include <iostream>
 8 using namespace std;
 9 
10 void Print1ToMaxOfNDigitsRecursively(char *n, int len, int index){
11     if (index == len-1){        // 已设置完所有的n位
12         PrintNumber(n);        // 同解法1
13         return;
14     }
15     for (int i = 0; i < 10; i++){
16         n[index+1] = '0' + i;
17         Print1ToMaxOfNDigitsRecursively(n, len, index+1);    // 递归打印len位数字
18     }
19 }
20 
21 void Print1ToMaxOfNDigits(int n){
22     if (n <= 0)
23         return;
24     char* number = new char[n+1];
25     memset(number, '0', n);
26     number[n] = '\0';
27 
28     for (int i = 0; i < 10; i++){
29         number[0] = '0' + i;
30         Print1ToMaxOfNDigitsRecursively(number, n, 0);    // 递归打印n位数字
31     }
32     delete[] number;
33 }
34 
35 int main(){
36     Print1ToMaxOfNDigits(9);
37     return 0;
38 }

 

posted @ 2015-10-10 11:46  KindaCrazy  阅读(158)  评论(0编辑  收藏  举报