列印1到最大的n位數

2021-07-10 17:52:05 字數 1675 閱讀 1984

這道題是面試過可能會遇到的手寫**題。如n為3時,那麼需要列印1到999。需要注意的是當輸入的n很大時,最大的n位數是不能通過int或者long long int來表示,此時可以使用字元陣列來儲存。

思路一:

1到n位最大數值採用字元陣列儲存。數值的高位儲存在字元陣列的低位址位。

#include 

#include

using

namespace

std;

//利用case語句使字元++

char charplus(char a)

bool increment(char* numchar,int len)

return

true;

} //列印輸出時,要符合一般習慣,把前面的0去掉,從左開始列印

void printnum(char* numchar)

char * numchar = new

char[n+1];

memset( numchar,'0',sizeof(char)*(n+1) );

numchar[n] = '\0'; //先對字串陣列初始化

while ( increment(numchar,n) ) //字串陣列++,如果已經是最大則返回false

delete numchar;

} int main()

這種做法便於理解,但是**卻有點冗長。要在面試短短幾十分鐘內寫完整,確實有點難度。這鍛鍊了考生的耐心程度。一般面試時,寫的**都不會很長,大概50行左右。因此,我們可以換思路去考慮問題。

思路二:

換思路,n位所有十進位制數其實就是n個0-9的數全排列的過程,只是排在前面的0我們不列印出來。

全排列可以用遞迴去寫,遞迴結束條件是我們已經設定了數字的最後一位。

void print1tomaxofndigitsrecursively(char* numchar, int length, int

index)

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

} void print1tomaxofndigits(int n)

char * numchar = new

char[n+1];

numchar[n] = '\0'; //先對字串陣列初始化

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

delete numchar;

}

測試用例

功能測試(輸入1、2、3……)

特殊輸入測試(輸入-1,0)。

考點:

考查解決大數問題的能力;

時間空間複雜度盡可能好;

能否用遞迴做。

總結:

如果面試題是關於n位的整數並且沒有限定n的取值範圍,或者是輸入任意大小的整數,那麼這個題目很有可能是需要考慮大數問題。字串是乙個簡單、有效的表示大數的方法。

[1]

[2]劍指offer.何海濤.電子工業出版社

列印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代表有沒有溢位 是不是...