剑指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 }
越努力,越幸运