1. 程式人生 > >列印1到最大的n位數:大數問題,全排列實現

列印1到最大的n位數:大數問題,全排列實現

題目:
輸入數字n,按順序打印出從1到最大的n位十進位制數。比如,輸入3,則打印出1,2,3,…..,一直到最大的3位數即999。

劍指offer上的題目,典型的大數加法問題,無論是int還是long 型別都可能會溢位。所以在解決大數問題時,通常是使用字串或者陣列實現其功能。
思考:

  1. 字串String在這裡需要不斷做改變,大家都知道String是不可變的,所以每次都需要新建String物件。因此,採用陣列方式,字元 int均可;
  2. 劍指offer上程式碼對全排列表述重複,再次做小修改。
    //最重要遞迴函式實現全排列
public static void Print_1ToMax_Of_Ndigits
(int[] number, int length,int index) { //檢查當前是否 溢位,溢位代表排列已滿,即最後一位已經賦值,直接將當前數字number列印即可; if(index ==length){ PrintNumber(number); return; } for(int i=0;i<10;i++){ number[index]=i; PrintMaxOfNdigits(number, length, index+1
); } System.out.println("");//最高位變一次,輸出一次空行 } //列印字元陣列number public static void PrintNumber(int[] number){ boolean isBeginning0=true; for(int i=0;i<number.length;i++){ if(isBeginning0&&number[i]!=0) isBeginning0=false; if
(!isBeginning0){//從第一個非0數字列印 System.out.print(number[i]); } } System.out.print("\t");//一個數字輸出完畢 } public static void PrintNumber(int n){ if(n<=0) return; int[] number = new int[n]; Print_1ToMax_Of_Ndigits(number, n, 0); }

全排列,演算法中實現時就是在迴圈中指定第一個數字後,再去for指定第二個,第三個;在這期間需要去判斷,指定的位數是否已滿,已滿則直接將這個拼好的 int[] 輸出即可。