打印1到最大的n位数

题目:输入数字n,按顺序打印从1、2、3….到最的n位数的十进制数。如输入3,打印1、2、3….999.

注意问题
1、n<=0
2、大数问题,n位数的最大值,可能超过long范围,发生越界,解决办法是用字符串或者数组存放数。

解决办法一:

//打印1、2、3...最大的n位数
    static void print1ToMaxOfDigits(int n){
        if(n<=0) //非法输入
            return ;
        String MaxDigits = null;
        StringBuffer sb = new StringBuffer();
        String digits = null;
        for(int i=0;i<n;i++) 
            //最大的n位数
            sb.append(9);
        MaxDigits = sb.toString();
        int number = 1;
        int tab = 0;
        //循环条件不等于最大n位数
        while(!MaxDigits.equals(digits)) {
            //算法的缺点是,这里会产生大量string对象,占用空间
            digits = number++ + "";
            System.out.print(digits+" ");
            tab++;
            if(tab == 20) {
                System.out.println();
                tab = 0;
            }
        }

    }

解决办法二:

用字符数组来存放数字,数组长度为n,初始化都为零,从1开始,如果在数字前面都补零的话,就会发现其实n位的所有十进制数都是0~9的全排列;也即是说我们把数字的每一位0~9排序一遍,就得到了所有十进制数,只是在打印的时候,不打印0.
全排列很容易用递归实现,数字的每一位都可能是0~9中的一个数,然后设置下一位,递归结束条件是我们已经设置了数字的最后一位。

代码:

static void print1ToMaxOfDigitsRec(int n) {
        if(n<=0)
            return;
        char[] number = new char[n];
        for(int i=0;i<10;i++) {
            number[0] = (char) (i + '0');
            print1ToMaxOfDigitsRecursively(number,n,0);
        }
    }

  static void print1ToMaxOfDigitsRecursively(char[] number, int len,
            int index) {
        if(index == len-1){
            printNum(number);
            return;
        }

        for(int i=0;i<10;i++) {
            number[index+1] = (char) (i + '0');
            print1ToMaxOfDigitsRecursively(number, len, index+1);
        }
    }

    private static void printNum(char[] number) {
        boolean isBegining = true;
        int len = number.length;
        for(int i=0;i<len;i++) {
            if(isBegining && number[i]!= '0') {
                isBegining = false;
            }
            if(!isBegining){
                System.out.print(number[i]);
            }
        }
        System.out.println();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值