1 /*
2 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999
3 */
4
5 //如果初看的话很容易认为题目非常简单,用一个循环喀什逐个打印就可以。但是仔细分析这个问题,我们就可以知道并么有规定n的范> 围。当输入 n很大的时候,我们求最大的n位数用long long都会溢出,也就是考虑大数问题
2 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999
3 */
4
5 //如果初看的话很容易认为题目非常简单,用一个循环喀什逐个打印就可以。但是仔细分析这个问题,我们就可以知道并么有规定n的范> 围。当输入 n很大的时候,我们求最大的n位数用long long都会溢出,也就是考虑大数问题
6
7 #include<iostream>
8 #include<string.h>
9 using namespace std;
10
11 void Print1ToMaxofNDigitsRecursively(char* number,int length,int index);
12 void PrintNumber(char* number);
13
14 //打印1到n位的所有十进制数
15 void Print1ToMaxofNDigits(int n)
16 {
17 if(n < 0)
18 return;
19 char* number = new char[n+1];
20 number[n] = '\0';
21
22 for(int i = 0; i < 10; ++i)
23 {
24 number[0] = i + '0';
25 Print1ToMaxofNDigitsRecursively(number,n,0);
26 }
27 delete []number;
28 }
29
30 //递归结束的条件是已经设置了最后一位
31 void Print1ToMaxofNDigitsRecursively(char* number,int length,int index)
32 {
33 if(index == length -1)
34 {
35 PrintNumber(number);
36 return;
37 }
38
39 for(int i = 0; i < 10; ++i)
40 {
41 number[index+1] = i + '0';
42 Print1ToMaxofNDigitsRecursively(number,length,index+1);
43 }
44 }
45
46 //打印函数 不打印开头为0的数
47 void PrintNumber(char* number)
48 {
49 bool isBeginning0 = true;
50 int nLength = strlen(number);
51
52 for(int i = 0; i < nLength; ++i)
53 {
54 if(isBeginning0 && number[i] != '0')
55 isBeginning0 = false;
56
57 if(!isBeginning0)
58 {
59 printf("%c",number[i]);
60 }
61 }
62 printf("\t");
63
64 }
65
66 int main()
67 {
68 cout<<"please input a number"<<endl;
69 int n;
70 cin>>n;
71 Print1ToMaxofNDigits(n);
72 return 0;
73 }