题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。
主要的坑点在:大数的溢出。当然,es6 提供了BigInt
数据类型,可以直接相加不用担心溢出。
除此之外,这题显然是要我们模拟“大数相加”:将最低位加 1,然后每次检查是否进位,如果不进位,直接退出循环;如果进位,需要保留进上来的 1,然后加到下一位,直到不进位或者超出了我们规定的范围。
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);