天天看點

劍指offer:列印1到最大的n位數

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

1、這是一個典型的大數加法問題,當面試官不允許使用BigInteger實作大數加法的時候,通常是使用字元串或者數組實作其功能。

2、在大數的加法中,我們需要注意的問題是對變量number不斷遞增+1,實作列印,但我們需要知道什麼時候停止number+1,即到了最大的n位數。這裡需要一個小技巧,我們隻需判斷最高位(第n位)是否要進位,如果需進位,則已經為最大數。

3、需要注意列印數組中的數字時,補位的0不應該列印。

public boolean Increment(int[] number){                 //  這個方法是用來實作對數加1操作
        boolean isOverflow = false;
        int nTakeOver=0;
        for(int i=number.length-1;i>=0;i--){
            int nSum = number[i]+nTakeOver;
            if(i==number.length-1)
                nSum++;
            if(nSum>=10){
                if(i==0)
                    isOverflow=true;
                else{
                    nTakeOver=1;
                    nSum=nSum-10;
                    number[i]=nSum;
                }
            }
            else{
                number[i]=nSum;
                break;
            }
        }
        return isOverflow;
    }
    
    public void PrintNumber(int[] number){   //該方法是負責列印一個正類,千萬不要嘗試将數組變成一個整數
        boolean isBeginning=true;
        for(int i=0;i<number.length;i++){
            if(isBeginning&&number[i]!=0)
                isBeginning=false;
            if(!isBeginning){
                System.out.print(number[i]);
            }
        }
    }
    
    public void Test(int n){     //列印從1到最大的n位整數
        if(n<=0)
            System.out.println("輸入出錯,請重新輸入!");
        int[] number = new int[n];

        while(!Increment(number)){
            PrintNumber(number);
            //System.out.println();
        }
    }