劍指offer17 列印從1到最大的n位數

2021-09-27 13:36:50 字數 1616 閱讀 6645

題目:輸入數字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 為正...