凸多边形对角线数计算JS代码第16测试用例报错问题求解
问题分析
报错原因
- 大整数精度丢失:JS内置
Number类型为双精度浮点数,最大安全整数仅为2^53 - 1(约9e15)。当N取到1e9时,n*(n-3)的结果达到1e18量级,远超出安全整数范围,浮点数精度丢失导致计算结果错误,这就是第16个大数值测试用例不通过的核心原因。 - 边界值处理缺失:当N<3时不存在符合要求的凸多边形,对角线总数应为0,但原公式直接计算会得到负数结果,不符合规则要求。
修复方案
使用JS ES2020新增的BigInt类型处理大整数运算,同时补全边界值判断,修正后代码如下:
const fs = require('fs'); const data = fs.readFileSync('input.txt', 'utf8'); const n = BigInt(data.trim()); const res = n < 3n ? 0n : n * (n - 3n) / 2n; fs.writeFileSync('output.txt', res.toString(), 'utf8');
修复说明
BigInt支持任意精度的整数运算,哪怕N取到1e9甚至更大,都不会出现精度丢失问题。- 提前判断N<3的场景直接返回0,符合凸多边形对角线的实际计算规则。
- 由于凸多边形对角线公式
n*(n-3)/2的计算结果必然为整数,BigInt的整除运算无需额外取整处理。
内容的提问来源于stack exchange,提问作者Mukhammadyusuf Abdurakhimov
相关产品推荐
相关产品推荐

