剑指offer 打印从1到最大的n位数

题目描述:

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

 

分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或者long long存储,因此需要用字符串表示。

 

思路:我们用n位全排列解法,每一位都可以是0~9的数。利用递归解法。需要注意的是前导0不要输出,比如一位的时候只打印1-9, 2位的时候打印1-9(而不是01、···)、10-99.

 

 1 #include <iostream>
 2 #include <algorithm> 
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);
 7 
 8 void PrintNumber(char* number) {
 9     int index = 0;
10     bool isBeginning0 = true;
11     int nlength = strlen(number);
12     //索引到左边第一位不为0的下标。特别注意的是整个字符串全为0的情况
13     for (int i = 0; i < nlength; i++) {
14         if (number[i] != '0') {
15             index = i;
16             break;
17         }
18     }
19     if (!(index == 0 && number[index] == '0')) {
20         for (int i = index; i < nlength; i++) {
21             printf("%c", number[i]);
22         }
23         printf("\n");
24     }
25 }
26 
27 void Print1ToMaxOfNDigits(int n) {
28     if (n <= 0) {
29         return;
30     }
31     char *number = new char[n + 1];
32     number[n] = '\0';
33     for (int i = 0; i < 10; i++) {
34         number[0] = i + '0';
35         Print1ToMaxOfNDigitsRecursively(number, n, 0);
36     }
37     delete [] number;
38 }
39 
40 void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index) {
41     if (index == length - 1) {
42         PrintNumber(number);
43         return;
44     }
45     for (int i = 0; i < 10; i++) {
46         number[index + 1] = i + '0';
47         Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
48     }
49 }
50 
51 int main() {
52     int number;
53     while (cin >> number) {
54         Print1ToMaxOfNDigits(number);
55     }
56     return 0;
57 }

 

posted @ 2019-07-26 12:02  琴影  阅读(878)  评论(0编辑  收藏  举报