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

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。
解决办法

彻底抛弃浮点数函数,改用整数位运算计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:31:09