from:
演算法一:最直觀的演算法,求出最大的n位數是多少,然後乙個迴圈列印。
[cpp]view plain
copy
void
print1tomaxofndigits1(
intn)
演算法二:字串表示大數
當n很大時,演算法一可能會溢位,所以考慮大數問題一般用陣列或字串。
用字串表達數字的時候,最直觀的方法就是字串裡每個字元都是』0』
到』9』
之間的某乙個字元,表示數字中的某一位。因為數字最大是n
位的,因此我們需要乙個n+1
位字串(最後一位為結束符號』/0』
)。當實際數字不夠n
位的時候,在字串的前半部分補零。這樣,數字的個位永遠都在字串的末尾(除去結尾符號)。
首先我們把字串中每一位數字都初始化為』0』
。然後每一次對字串表達的數字加1
,再輸出。因此我們只需要做兩件事:一是在字串表達的數字上模擬加法。另外我們要把字串表達的數字輸出。值得注意的是,當數字不夠n
位的時候,我們在數字的前面補零。輸出的時候這些補位的0
不應該輸出。比如輸入3
的時候,那麼數字98
以098
的形式輸出,就不符合我們的習慣了。
[cpp]view plain
copy
bool
increment(
char
* number)
} else
} return
isoverflow;
} void
printnumber(
char
* number)
} cout<<" "
; }
void
print1tomaxofndigits2(
intn)
coutnumber;
}
演算法三:其實本題也就是求n位數的0~9的全排列
第二種思路基本上和第一種思路相對應,只是把乙個整型數值換成了字串的表示形式。第二種思路雖然比較直觀,但由於模擬了整數的加法,**有點長。要在面試短短幾十分鐘時間裡完整正確寫出這麼長**,不是件容易的事情。接下來我們換一種思路來考慮這個問題。如果我們在數字前面補0
的話,就會發現n
位所有10
進製數其實就是n
個從0到9
的全排列。也就是說,我們把數字的每一位都從0
到9排列一遍,就得到了所有的10
進製數。只是我們在輸出的時候,數字排在前面的0
我們不輸出罷了。
全排列用遞迴很容易表達,數字的每一位都可能是0
到9中的乙個數,然後設定下一位。遞迴結束的條件是我們已經設定了數字的最後一位。
[cpp]view plain
copy
void
printnumber(
char
* number)
} cout<<" "
; }
void
print1tomaxofndigitsrecursively(
char
*number,
intlength,
intindex)
for(int
i=0; i<10; i++)
} void
print1tomaxofndigit3(
intn)
} 遞迴能夠用很簡潔的**來解決問題。
輸出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...
輸出1到最大的N位數
題目 輸入數字 n,按順序輸出從 1最大的n位 10進製數。比如輸入 3,則輸出1 2 3一直到最大的 3位數即 999。分析 這是一道很有意思的題目。看起來很簡單,其實裡面卻有不少的玄機。應聘者在解決這個問題的時候,最容易想到的方法是先求出最大的 n位數是什麼,然後用乙個迴圈從 1開始逐個輸出。很...