題目:輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,則列印出1、2、3一直到最大的3位數999。
【例】
#include
#include
#include
using
namespace std;
void
printnumn
(int n)
for(i =
1; i < number; i++
)printf
("\n");
}int
main()
執行結果為:
缺陷:當輸入的n很大的時候,用int和long long型別都會溢位,即:不能表示大數。
解決辦法:用字串模擬數字加法
1、概念
用字串或者陣列表達大數。用字串表示數字的時候,最直觀的方法就是字串裡每乙個字元都是『0』到『9』之間的某乙個字元,用來表示數字中的一位。
2、基本思路
(1)因為數字最大是n位的,所以需要乙個長度為n+1的字串(字串中最後乙個是結束符『\0』)。
(2)把字串中每一位的數字都初始化為『0』,然後每一次為字串表示的數字加1,,再列印出來。
(3)因為初始化字串中每一位數字為0,所以當實際數字不夠n位的時候,在字串的前半部分補0。
3、解題步驟
(1)在字串表達的數字上模擬加法
注意:什麼時候字串停止加1?當加1時,第乙個字元產生進製,則表示已經是最大的n位數,這時停止加1。例如,99加1的時候,才會在第乙個字元(下標為0)的基礎上產生進製,這時停止加1。
(2)把字串表達的數字列印出來
注意:當數字不夠n位的時候在數字的前面補0,但是列印的時候這些補位的0不應該列印出來。例如,輸入2的時候,數字8用字串表示成「08」,應該列印出8,而不是「08」。所以,在碰到第乙個非0的字元之後才開始列印,直至字串的結尾。
4、解題程式
#include
#include
#include
using
namespace std;
bool
increment
(char
* number)
if(nsum >=10)
else
}else
}return overbool;
}void
printf
(char
* number)
if(inputbool)
//從第乙個非0的字元開始列印
}printf
("\t");
}void
printfnumn
(int n)
//因為字串以『\0』結尾,所以要分配n+1個空間,而不是n個
char
* number =
newchar
[n +1]
;memset
(number,
'0', n)
; number[n]
='\0'
;while
(increment
(number)
)//如果不越位,則列印
}int
main()
列印從1到最大的n位數
題目 輸入數字n,順序列印從1到最大n位的十進位制數,例如輸入3,列印1到999 includebool increment char number void printnumber char number void printtomaxofndigitsrecursively char numbe...
列印從1到最大的n位數
void print1tomaxofndigits int n 上面的 有個最嚴重的問題 沒有關注n的範圍 當輸入的n很大時,我們求最大的n位數用int或者long long都會溢位。也就是我們需要考慮大數問題。因為數字最大是n位,所以我們需要用乙個長度是n 1的字串 字串最後一位放 0 當實際的數...
列印從1到最大的n位數
題目 輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。思路 首先注意這是個大數問題,n很大的時候c 的int和long long都吃不消,所以數字的儲存要用字串 這裡我模擬了大數相加,只不過每次都是加1 另外要注意列印的問題,cout比較慢...