1. 程式人生 > >面試題12:列印1到最大的n位數

面試題12:列印1到最大的n位數

如輸入3,輸出1到999
注意,此題不能簡單的用整型儲存最大位數,因為可能會溢位,也就是說,我們需要考慮大數問題。

public static void print1ToN(int n){
        List<Integer> list=new ArrayList<>();
        //list的長度=n的值
        for(int i=0;i<n;i++){
            list.add(0);
        }
        int carryBit=0;//進位
        boolean end=false;//到達最大位數,退出迴圈
while(true){ /** * 每做一次list的遍歷: * 1.每一位都要判斷是否有進位,並用原本的數字+進位作為該位上的新的數字 2.如果是最低位,則+1 3.如果該位上的數字>9,向前進一位,當前位設為0 做完一次遍歷,說明生成了一個新的數,輸出。 退出迴圈:最高位上的數字>9 */ for(int i=list.size()-1
;i>=0;i--){ int number=list.get(i)+carryBit; if(i==list.size()-1) number+=1; if(number>9){ if(i==0) end=true; else{ number-=10; carryBit=1
; } }else{ carryBit=0; } list.set(i, number); } if (end) { break; } output(list); } } /** * 輸出list代表的數字,要從前往後找到第一個非0的數字開始輸出。 * @param list */ public static void output(List<Integer> list){ int i=0; while(i<list.size()){ if(list.get(i)!=0) break; i++; } while(i<list.size()){ System.out.print(list.get(i)); i++; } System.out.println(); }

第一輪for迴圈:
carrybit=0,i=2,digit=0,sum=0+0=0,sum=0+1=1,—->0 0 1
carrybit=0,i=1,digit=0,sum=0+0=0,—->0 0 1
carrybit=0,i=0,digit=0,sum=0+0=0,—->0 0 1

第二輪for迴圈:
carrybit=0,i=2,digit=0,sum=0+0=0,sum=1+1=2,—->0 0 2
…..
第10輪for迴圈:
carrybit=0,i=2,digit=0,sum=0+0=0,sum=9+1=10,sum=0,carrybit=1—->0 0 0
carrybit=1,i=1,digit=0,sum=0+1=1,—->0 1 0