您的位置:首页 > 其它

打印1到最大的n位数

2017-03-28 14:32 162 查看
    输入数字n,按顺序打印从1到最大的n位十进制。比如输入3,则打印1、 2、 3一直到最大的3位数即999.

    题目出自剑值offfer上面,主要有一下几点需要注意:

    1、防止溢出,则需要使用字符串或者数组来表示大数

    2、打印输出时需要注意输出的开头字母不能为零

    具体代码如下,有很多注释,应该比较好理解

public class Solution1 {
//利用集合来实现1到n的打印输出
public static void Initial(int n){
List<Integer> ls=new ArrayList();
//将集合中的所有位数初始化为0;ls[0]位最高位
for(int i=0;i<n;i++){
ls.add(0);
}
//计算进位
CalculateIncrement(ls);
}
public static  void CalculateIncrement(List<Integer> ls){
//一直循环增加打印,知道最高位进位,打印结束
int sum=0;
int carrybit=0;//进位标志
int digit=0;
boolean flag=true;
while(flag){
//从最低位开始遍历
for(int i=ls.size()-1;i>=0;i--){
//只能从最低位开始加一
digit=ls.get(i);
sum=digit+carrybit;//看是否有进位,有就加一
if(i==ls.size()-1){
sum=ls.get(i)+1;//最低位加一
}
//判断当前数是否进位
if(sum>=10){
if(i==0){//证明是最高位溢出,设置退出条件
flag=false;
}
sum = sum - 10;//重新设置sum的值

                    carrybit = 1;//进位符变成1
}else{//记得将进位符设置之后,一定到设置回来
carrybit = 0;

}
//将当前数放入集合中
ls.set(i,sum);
}
//集合没、遍历完一次,都要输出打印,但是打印一定要注意集合前面的0
print(ls);
}
}
public static void print(List<Integer> ls){
//从最高位开始打印,碰到第一个0就跳过
boolean flag=true;
for(int i=0;i<ls.size();i++){
if(flag&&ls.get(i)!=0){
flag=false;//找到第一个开头不是零
}
if(!flag){
System.out.print(ls.get(i));
}
}
System.out.println();
}
public static void main(String[] args) {

      Scanner scan=new Scanner(System.in);

      int n=scan.nextInt(); 

      Solution1.Initial(n);

    }

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: