C++代码在不同编译器输出结果不一致,求原因与解决方法
问题原因分析
你的代码依赖log2()和pow()这类浮点数数学函数,而浮点数本身存在精度上限,处理1000000000这类大整数时会触发精度丢失:
log2(1000000000)的精确值约为29.897,强制转为long long会截断为29。但计算pow(2, 30)时,不同编译器的数学库实现精度有差异:- VS的数学库能精确算出
1073741824; - Codeforces使用的GCC数学库可能因浮点数误差,得到接近
1073741824但略小的值(比如1073741823.9999999),强制转整数时会被截断为1073741823,最终导致2*(pow(2,1+z)-1)的结果少了2,输出总和因此差2。
- VS的数学库能精确算出
解决办法
彻底抛弃浮点数函数,改用整数位运算计算z(即找到小于等于y的最大2的幂的指数),完全消除精度误差。
修正后的代码
#include <bits/stdc++.h> using namespace std; int main() { cout << fixed << setprecision(90); long long x, y; cin >> x; for (int i = 0; i < x; i++) { cin >> y; long long sum = y * (y + 1) / 2; // 循环移位计算z:统计y的最高位对应的2的幂指数 long long z = 0; long long temp = y; while (temp >>= 1) { z++; } // 也可以用GCC内置函数简化(针对unsigned long long) // long long z = 63 - __builtin_clzll(y); sum -= 2 * ((1LL << (z + 1)) - 1); // 左移操作替代pow(2, z+1) cout << sum << "\n"; } return 0; }
关键修改点
- 用循环移位或内置位运算函数计算z,全程基于整数操作,无精度损失;
- 用
1LL << (z+1)替代pow(2, z+1),左移是精确的整数幂计算方式。
内容的提问来源于stack exchange,提问作者Omar Mokhtar
相关产品推荐
相关产品推荐

