演算法題 列印1到最大的n位數

2021-06-23 01:38:36 字數 1520 閱讀 4806

今天看到劍指offer上的第12題,題目如下:

輸入數字n,按順序列印出從1到最大的n位十位數。比如輸入3,則列印出1,2,3,...,999。

當我看到這個題目的時候,第一感覺就是用遞迴,為什麼呢?首先得從我們的乙個實際數字出發,比如123,我們對數字加1,實際上分為如下兩個步驟:

步驟1:最低位加1;

步驟2:若發生進製,則向更高位傳播該進製的影響(這也是遞迴的所在)。

在完成這個演算法題之前,我想插一句「細節決定成敗!」,我們寫乙個程式,其實大體的思路都能想到,而往往忽略對細節的考慮,如本題需要考慮的問題如下:

1.如何表示乙個n位數?(用字元陣列)

2.每次加1都在最低位進行;

3.加1後若發生進製,則將該進製傳播給高位數字(這裡既可用迴圈,也可用遞迴);

4.若最高位發生進製,則溢位,該溢位可作為列印最後乙個數的標誌;

5.列印數字時,只能從最高位不為0的數字起開始列印。(這符合數字的正常表示)

遞迴實現如下:

#include#includeusing namespace std;

bool increment(char *str,int length)//字串加1,如果為發生溢位,則返回true,否則返回返回false

int sum=str[length-1]-'0'+1;

if(sum<10)//如果不發生進製

else

str[length-1]='0';//發生進製,把剩下的任務交給前length-1個字元

return increment(str,length-1);//遞迴表示式 }}

void print(char *str)//列印字元,列印時去掉前面的幾個0

delete str; }}

int main()

} return 0;

}

非遞迴實現如下:

#include#includeusing namespace std;

bool increment(char * str)//用於將當前字串對應的數字加1,返回true表示增加成功

else//如果當前位發生進製

else//如果進製的不是最高位,這裡能保證i!=0,因為上面有個為0的分支處理

}} return true;

}void print(char *str)//顯示該數字

} return 0;

}

測試結果如下:

列印1到最大的n位數

輸入數字n,按順序列印出1到最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。方法1 利用case語句使字元 char charplus char a if numchar len 0 判斷是否向高位移動,如果該為由9 0,則向高位移動 if flag numchar ...

列印1到最大的n位數

劍指offer用的是字串,還要苦逼的字串比較,看是否進製。直接用整型陣列來儲存。include include using namespace std 乙個int儲存幾位數 const int int num 2 每位數最大值,超過這個要進製 不包括最高位 const int int max 99 ...

列印1到最大的n位數

1.問題描述 輸入數字n,按順序列印出從1刀最大的n位數的十進位制數。比如輸入3,則列印出1,2,3一直到最大的3位數999.來自 劍指offer 2.分析 對於這個問題,我們需要考慮大數。因此我們在字串上模擬加法運算。3.ntakeover代表進製,isnotoverflow代表有沒有溢位 是不是...