打印1到最大的n位数

题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。

很容易就能写一个这样简单的代码

  static void solution(int n) {
    int number=1;
    int i=0;
    while(i++<n) {
      number *= 10;
    }
    for(i=1; i<number; i++) {
    System.out.println(i);
    }
  }

求出最大值是多少,然后依次输出比它小的所有数就行。这样的问题在于万一n很大,导致最大的数比int的范围大就会出错了。

我使用的是建立一个n大小的int数组,使用数组来表示一个大数。

    static Boolean solution(int n){
        if(n <= 0){
            return false;
        }
        int[] result = new int[n];
        int[] finallyResult = new int[n];
        Arrays.fill(result,0);
        Arrays.fill(finallyResult,9);
        //如果达到[9,9,9,9...]就是到最后的结果了
        while (!Arrays.equals(result,finallyResult)){
            //模拟加1
            Increment(result,result.length);
            //打印数字
            print(result);
        }
        return false;
    }

其中还建立了一个所有元素都是9的数组,用作当边界。

    static void Increment(int[]result, int lastSub){
        lastSub--;
        if(result[lastSub] == 9 ){
            //进位计算
            result[lastSub] = 0;
            Increment(result, lastSub);
        }else{
            result[lastSub]++;
        }
    }

这是进行加1操作的函数,如果将要加1的元素为9就代表这需要进位,这里使用递归解决。

    static void print(int[]result){
        //TAG是否打印0的标志
        int TAG = 0;
        //第一个不是0的数字之前的0都不打印
        for(int i = 0; i < result.length; i++){
            if(result[i] != 0){
                TAG = 1;
            }
            if(TAG == 0 && result[i] == 0){
                continue;
            }
            System.out.print(result[i]);
        }
        System.out.println();
    }

这是用于输出的函数。

原文地址:https://www.cnblogs.com/xxbbtt/p/7993364.html