輸入數字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輸...