【C++】列印1到最大的n位數
阿新 • • 發佈:2019-01-30
輸入數字n,按順序打印出從1到最大的n位十進位制數。例如,輸入3,則打印出1,2,3,到最大的三位數999。
不能直接使用int或者long型,因為這樣肯定會溢位,考慮用字串來輸出,將一個字串先初始化為00。。000,然後實現加法。
如何判斷已經達到最大的n位了呢?可以每輸出一次就與999.。。999比較,但這樣未免太麻煩,時間複雜度為O(N)。
如果是最大的n位數,那麼這個999.。。999再加1就會造成首位進位,也就是字元陣列的第一位進位,而其他所有小於最大n位數的都不會這樣,所以用這個來判斷,時間複雜度為O(1)。
另外在輸出時還要注意不輸出無效的前置0位。
void printNumber(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; } 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 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"); }