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

C++计算数组正负零元素占比时的舍入错误排查求助

C++计算数组正负零占比时测试用例不通过的修复方案

你的代码存在两个核心问题,直接导致测试用例失败:

  • 计数变量未初始化:pos、neg、zero这些float变量声明后未赋值为0,初始值是内存中的随机垃圾值,累加后统计结果完全错误。
  • 精度不足:float类型仅能提供6-7位有效数字,当数组规模较大时,除法运算的精度损失会超出题目允许的误差范围。

修复步骤

  1. 初始化计数变量为0,确保从正确起点开始统计
  2. 改用double类型进行计算,它拥有15-17位有效数字,完全满足题目精度要求
  3. (可选优化)将循环中的独立if改为else if,因为一个数只能属于正、负、零中的一类,减少不必要的判断
  4. 确保代码包含<iomanip>头文件,setprecision和fixed依赖该头文件支持

修正后的代码

#include <iomanip> // 必须包含此头文件才能使用setprecision和fixed

void plusMinus(vector<int> arr) {
    // 初始化计数变量为0,用double保证精度
    double pos = 0.0, neg = 0.0, zero = 0.0;
    // 将数组大小转为double,避免整数除法问题
    double arrsize = static_cast<double>(arr.size()); 
    
    // 范围for循环更简洁易读
    for(int num : arr) {
        if(num > 0)
            pos++;
        else if(num < 0)
            neg++;
        else
            zero++;
    }
    
    double posRatio = pos / arrsize;
    double negRatio = neg / arrsize;
    double zeroRatio = zero / arrsize;
    
    cout << fixed << setprecision(6) << posRatio << endl;
    cout << fixed << setprecision(6) << negRatio << endl;
    cout << fixed << setprecision(6) << zeroRatio << endl;
}

额外说明

  • 范围for循环替代传统索引循环,既简化代码也避免索引错误
  • 将计算结果单独存储,让逻辑更清晰,便于调试
  • 使用double计算后,精度完全覆盖题目允许的误差范围,不会因舍入问题导致测试失败

内容的提问来源于stack exchange,提问作者Leslie Castelan Chavez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:52:36