1. 题目描述

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

2. 思路分析

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

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

3. 代码实现

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

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
/**
* 用数组模拟大数相加操作
* @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)