題目:輸入數字n,按順序列印從1到最大的n為十進位制數。比如輸入3,則列印出1,2,3一直到最大的3位數999。看到這個問題之後,最容易想到的辦法就是先求出最大的n位數,然後用乙個迴圈從1開始逐個列印。於是很容易寫出以下**:
void print1tomaxofndigits_1(int n)
for(int i=1;i初看之下好像沒有問題,但如果仔細分析這個問題,可以看到題目中沒有規定n的範圍,當輸入的n很大時,所求的n位數用整型(int)或者長整型(long int)會不會溢位?也就是說我們需要考慮大數問題。
一、第一種方法
經過前面的分析可以知道該問題需要解決的是乙個大數,最常用也最容易的方法就是用字串或者陣列表示大數,下面用字串來解決這個大數問題。
在用字串表示數字的時候,最直觀的方法就是字串裡的每個字元都是『0』~『9』之間的某乙個字元,用來表示數字中的一位。因為數字最大是n位,因此需要乙個長度為n+1的字串,字串的最後一位是結束符『\0』,當實際數字不夠n位時,在字串的前半部分補0。
(1)開闢乙個長度為n+1位的字串,將字串中的每一位數字都初始化位『0』;
(2)在字串表達的數字上模擬加法,只有給「999...999」加1的時候,才會在第乙個字元(小標為0)的基礎上產生進製,如果加1時第乙個字元產生了進製,說明已經加到了最大的n位數,不需要在加了。
(3)將字串中表達的數字列印出來,在碰到第乙個非0的字元之後開始列印,直至字串的結尾。
具體**如下所示:
#include #include bool increment(char *number) //在字串表達的數字上模擬加法
if(nsum == 10)
else
}else
}return isoverflow;
}void printnumber(char *number) //從非0的字元開始列印,直至字串的結尾
{ bool isbeginning=true; //標記這個數字該不該列印
int nlength=strlen(number);
for(int i=0;i執行結果如下圖所示:
二、第二種方法
採用遞迴,將問題轉換成數字排列問題。如果在數字前面補0,會發現n位所有十進位制數其實就是n個從0到9的全排列,也就是說,把數字的每一位都從0到9排列一遍,就得到了所有的十進位制數,只是在列印的時候,排在前面的0不列印。
具體**如下所示:
#include void printnumber(char *number)
{ bool isbeginning=true;
int nlength=strlen(number);
for(int i=0;i執行結果如下所示:
劍指 Offer 17 列印從1到最大的n位數
題目 輸入乙個位數n,把1到最大的n位數 如當n 2時,為99 放到int裡返回。public int printnumbers int n 思路 1.直接用for來放入,不考慮大數問題。不考慮大數問題 public int printnumbers int n return array 2.當n變...
劍指 Offer 17 列印從1到最大的n位數
輸入數字n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1 2 3 一直到最大的 3 位數 999。示例 1 輸入 n 1 輸出 1,2,3,4,5,6,7,8,9 越來越覺得越是簡單的問題,遇到大數的時候就越難想出來處理的方式,感覺像是一種思維上的定式限制了我會用別的方...
劍指 Offer 17 列印從1到最大的n位數
劍指 offer 17.列印從1到最大的n位數 題目描述 輸入數字n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1 2 3 一直到最大的 3 位數 999。示例 輸入 n 1 輸出 1,2,3,4,5,6,7,8,9 說明 1.用返回乙個整數列表來代替列印 2.n 為正...