面試題17:列印1到最大的n位數
阿新 • • 發佈:2018-12-15
一、題目
輸入數字n,按順序打印出從1最大的n位十進位制數。比如輸入3,則打印出1、2、3一直到最大的3位數即999。
二、關鍵
1.解決大數問題,一般使用字串來解決。
三、解釋
1.
2.
3.注意
(1)關於n位整數並且沒有限定n的取值範圍,或者輸入任意大小的整數,那麼需要考慮大數問題。
(2)使用字串解決大數問題時,需要考慮數字前面的0是不能輸出的。
四、程式碼
#include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index); // ====================方法一==================== void Print1ToMaxOfNDigits_1(int n) { if (n <= 0) return; char *number = new char[n + 1]; memset(number, '0', n); number[n] = '\0'; while (!Increment(number)) { PrintNumber(number); } delete[]number; } // 字串number表示一個數字,在 number上增加1 // 如果做加法溢位,則返回true;否則為false bool Increment(char* number) { bool isOverflow = false; int nTakeOver = 0; int nLength = strlen(number); for (int i = nLength - 1; i >= 0; i--) { int nSum = number[i] - '0' + nTakeOver; if (i == nLength - 1) nSum++; if (nSum >= 10) { if (i == 0) isOverflow = true; else { nSum -= 10; nTakeOver = 1; number[i] = '0' + nSum; } } else { number[i] = '0' + nSum; break; } } return isOverflow; } // ====================方法二==================== void Print1ToMaxOfNDigits_2(int n) { if (n <= 0) return; char* number = new char[n + 1]; number[n] = '\0'; for (int i = 0; i < 10; ++i) { number[0] = i + '0'; Print1ToMaxOfNDigitsRecursively(number, n, 0); } delete[] number; } void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index) { if (index == length - 1) { PrintNumber(number); return; } for (int i = 0; i < 10; ++i) { number[index + 1] = i + '0'; Print1ToMaxOfNDigitsRecursively(number, length, index + 1); } } // ====================公共函式==================== // 字串number表示一個數字,數字有若干個0開頭 // 打印出這個數字,並忽略開頭的0 void PrintNumber(char* number) { bool isBeginning0 = true; int nLength = strlen(number); for (int i = 0; i < nLength; ++i) { if (isBeginning0 && number[i] != '0') isBeginning0 = false; if (!isBeginning0) { printf("%c", number[i]); } } printf("\t"); } // ====================測試程式碼==================== void Test(int n) { printf("Test for %d begins:\n", n); Print1ToMaxOfNDigits_1(n); Print1ToMaxOfNDigits_2(n); printf("\nTest for %d ends.\n", n); } int main(int argc, char* argv[]) { Test(1); Test(2); Test(3); Test(0); Test(-1); return 0; }