打印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 }