C语言求解Codeforces1080B大数值结果与逻辑不符(疑似类型转换问题)
Codeforces 1080B 代码错误原因分析
你的代码核心问题是整数溢出,具体错误点如下:
solve函数的形参l、r定义为int类型,返回值也为int类型。32位有符号int的最大值仅为2^31-1=2147483647,你在计算r*(r+1)这类乘法时,两个int类型参数的运算结果默认还是int,哪怕后续赋值给long int变量,运算过程中已经发生溢出截断,得到错误值。- 部分编译环境中
long int仅占4字节,依然无法承载1e9 * 1e9量级的中间计算结果,需要使用明确的64位整数类型long long存储所有参与运算的变量。
优化修正方案
你可以直接修改变量类型解决溢出问题,另外也可以采用更简单的前缀和计算逻辑,完全避免大数乘法:
我们可以先定义前缀和函数f(x)表示数组从第1项到第x项的和:
- 当x为偶数时,每两项和为1,总和为
x/2 - 当x为奇数时,总和为
-(x+1)/2
区间[l,r]的和直接等于f(r) - f(l-1),逻辑更简单且不易溢出。
修正后的代码示例:
#include <stdio.h> long long f(long long x) { if (x % 2 == 0) return x / 2; return -(x + 1) / 2; } long long solve(long long l, long long r) { return f(r) - f(l-1); } int main() { int t; scanf("%d", &t); while (t--) { long long l, r; scanf("%lld %lld", &l, &r); long long res = solve(l, r); printf("%lld\n", res); } return 0; }
内容的提问来源于stack exchange,提问作者Mohammad Azmee Tofail
相关产品推荐
相关产品推荐

