1. 题目描述

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

2. 思路分析

主要的坑点在:大数的溢出。当然,es6 提供了BigInt数据类型,可以直接相加不用担心溢出。

除此之外,这题显然是要我们模拟“大数相加”:将最低位加 1,然后每次检查是否进位,如果不进位,直接退出循环;如果进位,需要保留进上来的 1,然后加到下一位,直到不进位或者超出了我们规定的范围。

3. 代码实现

js 中不方便操作字符串中指定位置的字符,因此用数组对象来模拟。

/**
 * 用数组模拟大数相加操作
 * @param {Array} arr
 * @return {Boolean} true, 超出arr.length位最大整数; false, 没有超出arr.length位最大整数
 */
function increase(arr) {
  let length = arr.length,
    over = 0; // 记录前一位相加后的进位数

  for (let i = length - 1; i >= 0; --i) {
    arr[i] = arr[i] + over;

    if (i === length - 1) {
      arr[i] += 1;
    }

    if (arr[i] >= 10) {
      // 如果第n位进位,说明超出了n位最大数字
      if (i === 0) {
        return true;
      }

      arr[i] = arr[i] - 10;
      over = 1;
    } else {
      break;
    }
  }

  return false;
}

/**
 *
 * @param {Number} n
 */
function printMaxDigits(n) {
  if (n <= 0) {
    return;
  }

  let arr = new Array(n).fill(0);
  while (!increase(arr)) {
    console.log(arr);
  }
}

/**
 * 测试代码
 */
printMaxDigits(2);
printMaxDigits(3);
printMaxDigits(10);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53