JavaScript处理大数的替代方案?BigInt未定义报错求助
解决超大数字求和问题(替代BigInt的方案)
你的代码报错是因为Codeforces的JS环境版本较旧,不支持ES2020引入的BigInt特性。针对计算1到N的和(N为超过17位的大数),可以通过字符串模拟大数运算来实现,核心思路是利用求和公式sum = n*(n+1)/2,分步实现大数加法、乘法和除法(除以2):
实现代码
// 大数加法:两个字符串形式的数字相加 function addStrings(a, b) { let i = a.length - 1, j = b.length - 1; let carry = 0, result = []; while (i >= 0 || j >= 0 || carry > 0) { const digitA = i >= 0 ? parseInt(a[i]) : 0; const digitB = j >= 0 ? parseInt(b[j]) : 0; const sum = digitA + digitB + carry; carry = Math.floor(sum / 10); result.push(sum % 10); i--; j--; } return result.reverse().join(''); } // 大数乘法:两个字符串形式的数字相乘 function multiplyStrings(a, b) { const lenA = a.length, lenB = b.length; const result = new Array(lenA + lenB).fill(0); for (let i = lenA - 1; i >= 0; i--) { const digitA = parseInt(a[i]); for (let j = lenB - 1; j >= 0; j--) { const digitB = parseInt(b[j]); const product = digitA * digitB; const pos1 = i + j, pos2 = i + j + 1; const total = product + result[pos2]; result[pos1] += Math.floor(total / 10); result[pos2] = total % 10; } } // 移除前导零 while (result[0] === 0) result.shift(); return result.length === 0 ? '0' : result.join(''); } // 大数除以2:字符串形式的数字除以2(无余数,因为n和n+1必有一个偶数) function divideByTwo(s) { let result = []; let carry = 0; for (let c of s) { const digit = parseInt(c); const current = carry * 10 + digit; result.push(Math.floor(current / 2)); carry = current % 2; } // 移除前导零 while (result[0] === 0) result.shift(); return result.length === 0 ? '0' : result.join(''); } // 判断数字是否为偶数(字符串形式) function isEven(s) { const lastDigit = parseInt(s[s.length - 1]); return lastDigit % 2 === 0; } // 主逻辑 var n = readline(); let num1, num2; if (isEven(n)) { // n是偶数,先除以2再乘n+1 num1 = divideByTwo(n); num2 = addStrings(n, '1'); } else { // n是奇数,n+1是偶数,先把n+1除以2再乘n num1 = n; num2 = divideByTwo(addStrings(n, '1')); } const sum = multiplyStrings(num1, num2); print(sum);
优化说明
因为n和n+1中必有一个是偶数,先将偶数除以2再与另一个数相乘,能减少乘法运算的位数,提升计算效率。
内容的提问来源于stack exchange,提问作者amr samy
相关产品推荐
相关产品推荐

