You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:33:42