劍指offer面試題12 列印1到最大的n位數

2021-08-03 04:45:22 字數 1393 閱讀 4750

輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,就列印出1、2、3、一起到最大的3位數,即999。

這個題目看似簡單,但是當輸入的n很大時,求最大的n位數用整型或長整型都會溢位。這裡需要考慮大數問題。

用字串或者陣列來表示大數,首先我們把字串中的每個數字都初始化為』0』,然後每一次為字串表示的數字加1,再列印出來。因此我們只需要做兩件事情:

* 在字串表達的數字上模擬加法;

* 把字串表達的數字列印出來;

public

class printnnum

char arr = new

char[n + 1];

for (int i = 0; i < arr.length; i++)

while (!imcrement(arr))

}//在字串表示的數字上加1

private boolean imcrement(char arr)

arr[len] += 1;

if (arr[0] == '1')

return

false;}/*

* 按照我們的閱讀習慣,將字串表示的數字列印出來

* 即只有在碰到第乙個非0的字元之後才開始列印,直到字串的結尾

*/private

void

printnum(char arr) else

if (isbegin0 == 1) }}

}

注意:

我們在建立陣列時,建立了n+1位的陣列,當加到最大的n位數時,即99…9時,再加1,就會在第乙個字元(下標為0)的位置產生進製,當該位置產生進製時,則表示迴圈應該結束了。這樣也實現了用o(1)時間判斷是否已經到了最大的n位數。

我們把問題換個思路考慮,會發現n位所有十進位制數其實就是n個從0到9的全排列。也就是說,我們把數字的每一位都 從0到9排列一遍,就可以得到所有的十進位制數。只是在列印的時候,排在數字前面的0不列印出來而已。

全排列用遞迴很容易表達,數字的每一位都可能是0~9中的乙個數,然後設定下一位,遞迴結束的條件是我們已經設定好了數字的最後一位。

//全排列實現列印

private

void

printtomaxofndigits(int n)

char arr = new

char[n];

for (int i = 0; i < 10; i++)

}private

void

printtomaxofndigitsrecursively(char arr, int n, int index)

for (int i = 0; i < 10; i++)

}

劍指offer 面試題12 列印1到最大的n位數

題目 輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999.解法 這道提的陷進在於沒有規定最大的n位數的範圍,會不會溢位,也就是說我們要考慮大數問題。最常用也是最容易的方法是用字串或者陣列去表達大數。bool increment char nu...

劍指offer 面試題12 列印1到最大的n位數

題目描述 輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,列印1,2,3一直到最大的三位數999 題目分析 這個題不是簡單的用乙個for迴圈,當n很大的時候,就會超過數值的最大值介面,導致溢位。所以考慮使用字串表示整數。輸出n位數 public static void prin ig...

劍指Offer 面試題12 列印1到最大的n位數

題目 輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,則列印1 2 3一直到最大的3位數即999。陷阱 這個題目看似簡單,我們先求出最大的n位數,然後for迴圈從1開始列印。void printtomax int n 乍看沒啥毛病,但如果仔細分析會發現面試官並沒有指定n的範圍。當n輸...