面試題17 列印從1到最大的n位數

2021-08-20 22:21:22 字數 1829 閱讀 9388

輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1、2、3一直到最大的3位數即999。

2.1 跳進面試官陷阱

分析:這道題目看起來很簡單。我們看到這個問題之後,最容易想到的辦法就是先求出最大的n位數,然後用乙個迴圈從1開始逐個列印。於是寫出以下**:

void printtomaxofdigits_1(int n)

初看之下好像沒有問題,但是如果仔細分析這個問題:當輸入的n很大的時候,我們求最大的n位數是不是用整型(int)或者長整型(long long)都會溢位?也就是說我們需要考慮大數問題。

2.2 方法一:在字串上模擬數字加法

表達乙個大數最常用也是最容易的方法是用字串或者陣列表達大數。接下來我們用字串來解決大數問題。用字串表示數字的時候,最直觀的方法就是字串裡每個字元都是'0'~'9'之間的某乙個字元,用來表示數字中的一位,因為數字最大是n位,因此我們需要乙個長度為n+1的字串(字串的最後一位是結束符 '\0')。實際數字不夠n位的時候,在字串的前半部分補0。

首先把字串中的每乙個數字都初始化為'0',然後每一次為字串表示的數字加1,再列印出來。因此我們只需要做兩件事情:一是在字串表示的數字上模擬加法;二是把字串表達的數字列印出來。

#include #include #include using namespace std;

bool increment(char* number);

void printnumber(char* number);

// ********************方法一********************

void print1tomaxofndigits_1(int n)

deletenumber;

}// 字串number表示乙個數字,在 number上增加1

// 如果做加法溢位,則返回true;否則為false

bool increment(char* number)

}else

}return isoverflow;

}int main()

2.2 方法二:遞迴

分析:上述**雖然比較直觀,但是由於模擬了整數的加法,**有點長,如果我們在數字前面補0,就會發現,n位所有十進位制數其實就是n個從0到9的全排列,也就是說,我們把數字的每一位都從0到9排列一遍,就得到了所有的十進位制數,只是在列印的時候,排在前面的0不列印出來罷了。

全排列有遞迴很容易表達,數字的每一位都有可能是0-9中的乙個數,然後設定下一位,遞迴結束的條件就是我們已經設定了數字的最後一位。

#include #include #include using namespace std;

void printnumber(char* number);

void print1tomaxofndigitsrecursively(char* number, int length, int index);

void print1tomaxofdigits(int n);

void print1tomaxofdigits(int n)

delete number;

}void print1tomaxofndigitsrecursively(char* number, int length, int index)

for (int i = 0; i < 10; ++i) }

void printnumber(char* number)

} printf("\t");

}int main()

面試題17 列印從1到最大到n位數

次題其實考察的是大數問題,但是我目前是用python3進行程式設計,在python中沒有數字的限制,所以會出現直接迴圈的效率比用大數的方法要快,但是這裡還是建議大家先思考大數方法 其實就是輸入n就定義乙個n長度的陣列,每乙個位置代表真實數字對應的位置,然後分辨從0 9迴圈通過字串進行轉換,防止超出傳...

面試題17 列印從1到最大的n位數

我自己的實現,常規思路 include include using namespace std bool increment str char num str,int str len else if num str i 9 num str i 0 else return true void my p...

面試題17 列印從1到最大的n位數

題目 輸入數字n,按順序列印出從1到最大的n位十進位制數 分析 由於n未知,可能是非常大的數,常規的資料型別可能裝不下,考慮用字串陣列來儲存數字,但需要考慮一下兩個問題 字串陣列表示數字的相加演算法 通過模擬十進位制數的加法過程完成或其他方法 規範得列印出數字。include 題目 列印1到n位的最...