Skip to content

Latest commit

 

History

History

17_Print1ToMaxOfNDigits

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

打印从 1 到最大的 n 位数

这一题各个 OJ 平台上都没有。

题目描述

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

解法

此题需要注意 n 位数构成的数字可能超出最大的 int 或者 long long 能表示的范围。因此,采用字符数组来存储数字。

关键是:

  • 对字符数组表示的数进行递增操作
  • 输出数字(0开头的需要把0去除)
/**
 * @author bingo
 * @since 2018/12/18
 */

class Solution {

    /**
     * 打印从1到最大的n位数
     * 
     * @param n n位数
     */
    public void print1ToMaxOfNDigits(int n) {
        if (n < 1) {
            return;
        }
        char[] chars = new char[n];
        Arrays.fill(chars, '0');
        while (increment(chars)) {
            printNumber(chars);
        }
    }


    /**
     * 打印字符数组表示的数字(需要省略前n个0)
     * 
     * @param chars 字符数组
     */
    private void printNumber(char[] chars) {
        int i = 0, n = chars.length;
        for (; i < n; ++i) {
            if (chars[i] != '0') {
                break;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (; i < n; ++i) {
            sb.append(chars[i]);
        }
        System.out.println(sb.toString());
    }

    private boolean increment(char[] chars) {
        int n = chars.length;
        int carry = 1;
        for (int i = n - 1; i >= 0; --i) {
            int sum = chars[i] - '0' + carry;
            if (sum > 9) {
                if (i == 0) {
                    return false;
                }
                chars[i] = '0';
            } else {
                ++chars[i];
                break;
            }
        }
        return true;
    }
}

测试用例

  1. 功能测试(输入 1、2、3......);
  2. 特殊输入测试(输入 -1、0)。

题目导航

  1. 返回上一题
  2. 进入下一题
  3. 回到题目列表