题17:从一打印到n位最大数

题17:从一打印到n位最大数
输入一个数字n,按顺序打印出从一到最大的n位十进制数。
例:n = 3,则打印1、2、3…999

  1. 由于n的数值不确定,n的数值可能很大(打印的数可能是大数),所以我们不能用int和long类型的数来表示,这时我们会想到用字符串和数组表示大数。
  2. 用数组或字符串表示大数后,我们需要想的是利用字符串或数组实现数字的加一操作
  3. 实现了加一操作,接下来需要判断什么时候达到了最大数
  4. 然后就是把数字打印出来,并且需要符合正常的阅读习惯

我们可以观察到最大数的情况是9…9,如果都是9发生了进位,那么第一个9就会发生进位,其余的情况下第一位数不会发生进位,所以我们只需要判断进行加一操作的时候,观察第一位数是否产生了进位,如果产生了进位,那么就停止加一。

详细步骤可以看代码注释

public class PrintToN {

    public boolean increment(char[] number){

        //溢出标志
        boolean isOverFlow = false;
        //进位标志
        int nTakeOver = 0;
        //数字长度
        int len = number.length;
        //进行加一操作
        for (int i = len - 1; i >=0 ; i--) {
            //获取第n位上的数字,并且加上进位
            //另外:char强制转化为int,得到的是对应的ascii码,把char转化为int的最简单办法是 减去 '0'
            int sum = number[i] - '0' + nTakeOver;
            //如果是个位上的数,sum加一
            if(i == len - 1){
                sum++;
            }
            //sum>=10,说明产生了进位
            if(sum >= 10){
                //如果产生的进位是最高位,则表示溢出
                if(i == 0){
                    isOverFlow = true;
                }else{
                    //普通进位
                    sum -= 10;
                    nTakeOver = 1;
                    //另外:把int转化为char,不能直接强转,需要加上‘0’后再强转
                    number[i] = (char) (sum + '0');
                }
            }else{
                //没有产生进位
                number[i] = (char)(sum + '0');
                break;
            }
        }
        return  isOverFlow;
    }

    public void printNumber(char[] number){
    	//是否打印开始标志
        boolean isBegining = false;
        for(int i = 0;i < number.length;i++){
            if(!isBegining && number[i] != '0'){
                isBegining = true;
            }
            //开始打印
            if(isBegining){
                System.out.print(number[i]);
            }
        }
        System.out.println();
    }

    //test
    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        if(n <= 0){
            return;
        }

		//数字表示,初始每一位为0
        char[] number = new char[n];
        for(int i = 0;i < n;i++){
            number[i] = '0';
        }

        PrintToN printToN = new PrintToN();
        while(!printToN.increment(number)){
            printToN.printNumber(number);
        }

    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值