面試題12:列印1到最大的n位數
阿新 • • 發佈:2018-11-09
如輸入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