void print1tomaxofn(int n)
for(int i = 1; i < max; ++i)
}
上述**看是可以實現題目的功能,但是在面試中,面試官非常關注應聘者考慮問題是否周全,上述**完全沒有全面的思維,假如輸入的n足夠大,int 型甚至long long都無法容納該怎麼辦呢?如果面試官表明題目要求的任意大的數字,那麼這個問題就是乙個大數問題。最常用的也是最容易解決大數問題的方法就是字串或者字元陣列,接下來我們用字串來解決這個大數問題。
- 演算法分析:用字串表示數字的時候,最直觀的方法就是字串裡的每乙個字元都是『0』到『9』之間的某乙個字元,用來表示數字中的一位,最為最大的數字是n位,我們需要長度位n + 1的字串(最後一位是字串結束標誌『\0』),當實際位數不夠n的時候前面用0填充。所以我們**所要實現的就是首先把每乙個數字都初始化位『0』,然後每一次為字串表示的數字加1,在列印出來。我們可以分別用兩個函式實現,乙個函式在字串表示的數字上模擬加法,另乙個是列印出來。
- 實現**
void print(char *numbers)
printf("%s ",numbers);
}void print1(char *numbers)
}void print1tomaxofn(int n)
free(numbers);
}
完整**請戳:
- 優化完善:由於模擬了加法**看起來會比較的長,面試的時候寫這麼長的**,會有很大的壓力,我們可以換乙個思路來考慮這個問題。我們發現n位所有的十進位制數就是n個0到9的全排列,全排列用遞迴很容易實現,**也精簡了許多。
- 實現**
void print(char *numbers)
printf("%s ", numbers);
}void _print1tomaxofn(char *numbers, int
length, int
index)
for (int i = 0; i < 10; ++i)
}void print1tomaxofn(int n)
free(numbers);
}
完整**請戳:
2- 總結:看問題要細心全面,考慮問題要周全。要讓面試官看到我們全面的思維。
列印1到最大的n位數
輸入數字n,按順序列印出1到最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。方法1 利用case語句使字元 char charplus char a if numchar len 0 判斷是否向高位移動,如果該為由9 0,則向高位移動 if flag numchar ...
列印1到最大的n位數
劍指offer用的是字串,還要苦逼的字串比較,看是否進製。直接用整型陣列來儲存。include include using namespace std 乙個int儲存幾位數 const int int num 2 每位數最大值,超過這個要進製 不包括最高位 const int int max 99 ...
列印1到最大的n位數
1.問題描述 輸入數字n,按順序列印出從1刀最大的n位數的十進位制數。比如輸入3,則列印出1,2,3一直到最大的3位數999.來自 劍指offer 2.分析 對於這個問題,我們需要考慮大數。因此我們在字串上模擬加法運算。3.ntakeover代表進製,isnotoverflow代表有沒有溢位 是不是...