輸出1到最大的N位數

2021-06-08 12:32:05 字數 1831 閱讀 2656

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開始逐個輸出。很...