列印從1到n的最大n位數——面試題12《劍指offer 》
阿新 • • 發佈:2018-12-13
題目:
輸入數字n,按順序打印出從1到最大的n位十進位制數。例如,輸入3,則打印出1,2,3,到最大的三位數999。
C++程式碼實現:
void printNumber(int n) { if (n < 0) return; //陣列的初始化 char *number = new char[n + 1]; //建立一個n+1,多出來一個儲存'\0' memset(number, '0', n); //每一位都設定為0 number[n] = '\0'; //遞增以及列印 while (!Increment(number)) { printNumber(number); } delete[]number; //釋放記憶體空間 } //陣列高位為數值的個位 //用於數值向上加,且number只儲存當前一個數 bool Increment(char *number) { //設定初始狀態 bool isOverFlow = false; //最高位進位情況 int carry = 0; //每次計算的進位情況 int len =strlen(number); //字元長度 for(int i = len-1;i>=0;i--) { int temp_num = number[i] - '0' + carry; //字元轉換為數值 if(i==len-1) //個位加 temp_num++; if(temp_num >= 10) { if(i == 0) //最高為產生進位 isOverFlow = True; else //不是最高位則處理資料 { carry = 1; temp_num -= 10; number = temp_num + '0'; } } else //沒有進位,則當前位加完之後退出即可 { number =temp_num +'0'; break; } } return isOverFlow; } //列印字串,一個數 void PrintNumber(char *number) { bool isBeginning0 = true; //是否以零作為開頭,預設為是 int len = strlen(number) for(int i = 0; i<len-1; i++) { if(isBeginning0 && number[i] != '0') //當不等於0時候 isBeginning0 = false; //置為0,為了輸出 if(!isBeginning0) cout << number[i]; } cout <<"\t"; }
完整測試程式碼
#include<iostream> using namespace std; 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"); } 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; } int main() { int n; cin >> n; printNumber(n); system("pause"); return 0; }