輸出1到最大的N位數

2021-08-26 11:16:07 字數 2640 閱讀 3342

題目:輸入數字

n,按順序輸出從

1最大的n位

10進製數。比如輸入

3,則輸出1、

2、3一直到最大的

3位數即

999。

分析:這是一道很有意思的題目。看起來很簡單,其實裡面卻有不少的玄機。

應聘者在解決這個問題的時候,最容易想到的方法是先求出最大的

n位數是什麼,然後用乙個迴圈從

1開始逐個輸出。很快,我們就能寫出如下**:

// print numbers from 1 to the maximum numberwith n digits, in order

void

print1tomaxofndigits_1(

intn)

初看之下,好像沒有問題。但如果我們仔細分析這個問題,就能注意到這裡沒有規定

n的範圍,當我們求最大的

n位數的時候,是不是有可能用整型甚至長整型都會溢位?

分析到這裡,我們很自然的就想到我們需要表達乙個大數。最常用的也是最容易實現的表達大數的方法是用字串或者整型陣列(當然不一定是最有效的)。

用字串表達數字的時候,最直觀的方法就是字串裡每個字元都是』0』

到』9』之間的某乙個字元,表示數字中的某一位。因為數字最大是

n位的,因此我們需要乙個

n+1位字串(最後一位為結束符號』

\0』)。當實際數字不夠

n位的時候,在字串的前半部分補零。這樣,數字的個位永遠都在字串的末尾(除去結尾符號)。

首先我們把字串中每一位數字都初始化為』0』

。然後每一次對字串表達的數字加

1,再輸出。因此我們只需要做兩件事:一是在字串表達的數字上模擬加法。另外我們要把字串表達的數字輸出。值得注意的是,當數字不夠

n位的時候,我們在數字的前面補零。輸出的時候這些補位的

0不應該輸出。比如輸入

3的時候,那麼數字98以

098的形式輸出,就不符合我們的習慣了。

基於上述分析,我們可以寫出如下**:

// print numbers from 1 to the maximum numberwith n digits, in order

void

print1tomaxofndigits_2(

intn)

delete

number; }

// increment a number. when overflow, returntrue; otherwise return false

bool

increment(

char

*number) }

else

}return

isoverflow; }

// print number stored in string, ignore 0 atits beginning

// for example, print "0098" as"98"

void

printnumber(

char

*number) }

printf(

"\t");

}第二種思路基本上和第一種思路相對應,只是把乙個整型數值換成了字串的表示形式。同時,值得提出的是,判斷列印是否應該結束時,我沒有呼叫函式

strcmp

比較字串

number

和」99

…999」(n

個9)。這是因為

strcmp

的時間複雜度是

o(n)

,而判斷是否溢位的平均時間複雜度是

o(1)。

第二種思路雖然比較直觀,但由於模擬了整數的加法,**有點長。要在面試短短幾十分鐘時間裡完整正確寫出這麼長**,不是件容易的事情。接下來我們換一種思路來考慮這個問題。如果我們在數字前面補

0的話,就會發現

n位所有

10進製數其實就是n個從

0到9的全排列。也就是說,我們把數字的每一位都從0到

9排列一遍,就得到了所有的

10進製數。只是我們在輸出的時候,數字排在前面的

0我們不輸出罷了。

全排列用遞迴很容易表達,數字的每一位都可能是0到

9中的乙個數,然後設定下一位。遞迴結束的條件是我們已經設定了數字的最後一位。

// print numbers from 1 to the maximum numberwith n digits, in order

void

print1tomaxofndigits_3(

intn)

delete

number; }

// length: length of number

// index: current index of digit in number forthis round

void

print1tomaxofndigitsrecursively(

char

* number,

intlength,

intindex)

for(int

i = 0; i < 10; ++i) }

函式printnumber

和前面第二種思路中的一樣,這裡就不重複了。對比這兩種思路,我們可以發現,遞迴能夠用很簡潔的**來解決問題。

輸出1到最大的N位數

from 演算法一 最直觀的演算法,求出最大的n位數是多少,然後乙個迴圈列印。cpp view plain copy void print1tomaxofndigits1 intn 演算法二 字串表示大數 當n很大時,演算法一可能會溢位,所以考慮大數問題一般用陣列或字串。用字串表達數字的時候,最直觀...

輸出1到最大的N位數

輸出1到最大的n位數 原文 演算法一 最直觀的演算法,求出最大的n位數是多少,然後乙個迴圈列印。cpp view plain copy void print1tomaxofndigits1 intn 演算法二 字串表示大數 當n很大時,演算法一可能會溢位,所以考慮大數問題一般用陣列或字串。用字串表達...

輸出1到最大的n位數

題目 輸入數字n,按順序列印出從1到最大的n位十進位制數。eg 輸入3,輸出1 2 3 一直到999。思路 n有可能是乙個很大的數,要考慮到大數問題。用陣列或字串表達大數。用字串表示數字的時候,最直觀的方法就是字串裡每乙個字元都是 0 到 9 之間的某乙個字元,用來表示數字中的一位。因為數字最大是n...