使用BigInteger.js计算阶乘和时大整数加法失效问题
问题分析与修复方案
我看你遇到的问题是输入20 1时,程序输出的结果好像没加上1!,但输入相同数值或者小数值时都正常。仔细检查你的代码后,我发现了几个潜在问题,这里给你分析和修复方案:
1. 输入处理的鲁棒性不足
你的输入解析逻辑有两个小漏洞:
- 用
split(" ")分割输入,如果行里有多个空格(比如20 1),会生成带空字符串的数组,导致parseInt(strings[1])得到NaN,这时候计算factn的循环根本不会执行;虽然factn初始值是1,理论上sum应该是20!+1,但如果输入格式更混乱就会出问题 - 循环条件
lines[i] != ""有问题,如果输入数组末尾是undefined(比如只输入一行的情况),undefined != ""是true,循环会继续执行,这时候处理lines[i]会报错,但你没提到报错,可能是输入刚好触发了边界情况
修复:优化输入处理逻辑
把输入处理部分改成下面这样,能兼容多种输入格式(多个空格、空行、无效数值):
var input = require('fs').readFileSync('/dev/stdin', 'utf8'); var lines = input.split('\n'); var bigInt = require("big-integer"); // 遍历所有行,跳过空行 for (var i = 0; i < lines.length; i++) { var line = lines[i].trim(); if (!line) continue; // 按任意空白字符分割(支持多个空格、制表符) var strings = line.split(/\s+/); var m = parseInt(strings[0]); var n = parseInt(strings[1]); // 跳过无效的数值输入 if (isNaN(m) || isNaN(n)) continue; var factm = bigInt(1); var factn = bigInt(1); // 用a > 0替代a != 0,避免负数输入导致无限循环 for (var a = m; a > 0; a--) { factm = factm.multiply(a); } for (var b = n; b > 0; b--) { factn = factn.multiply(b); } var sum = factm.add(factn); console.log(sum.toString()); }
2. 可能的视觉误解
还有个小细节:20!的结果是2432902008176640000,加上1!之后是2432902008176640001——两者只有最后一位不同。如果控制台输出的内容太长,你可能没注意到末尾的变化,误以为加法没生效。可以特意检查输出结果的最后一位,确认是不是1。
3. 循环条件的小优化
原代码里的for (var a = m; a != 0; a--),换成a > 0会更稳妥,避免输入负数时出现无限循环的情况(比如输入-5 3,原循环会一直执行下去)。
改完之后,输入20 1应该能正确输出2432902008176640001,其他输入场景也会更稳定。
内容的提问来源于stack exchange,提问作者zadspecial
相关产品推荐
相关产品推荐

