版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/jingshuiliushen_zj/article/details/81981722
如输入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