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

C++使用循环实现累计差值反复扣减直至归零的方案咨询

C++ 实现代码
#include <vector>
#include <cmath>
#include <iostream>

using namespace std;

int main() {
    // 初始化参数
    vector<float> ages {1.3, 7.3, 99.7};
    double age_fixed = 8.1;
    vector<float> diff_ages;
    double cum_age = 0.0;

    // 第一轮遍历:计算初始diff_ages和累计差额
    for (int i = 0; i < ages.size(); i++) {
        // 若需要保留原需求的「仅年龄<12参与计算」筛选,打开下面这行注释即可
        // if (ages[i] >= 12) continue;
        double diff = ages[i] - age_fixed;
        if (diff > 0) {
            diff_ages.push_back(diff);
        } else {
            diff_ages.push_back(0);
            cum_age += abs(diff);
        }
    }

    // while循环处理累计差额,直到cum_age归零
    while (cum_age > 1e-6) { // 浮点数比较用极小阈值替代0,避免精度误差导致死循环
        for (int i = 0; i < diff_ages.size() && cum_age > 1e-6; i++) {
            // 仅从大于0的diff元素扣减差额
            if (diff_ages[i] <= 1e-6) continue;
            if (diff_ages[i] >= cum_age) {
                // 当前元素足够覆盖剩余累计差额,直接扣完
                diff_ages[i] -= cum_age;
                cum_age = 0;
            } else {
                // 当前元素全部扣完,累计差额减去对应数值
                cum_age -= diff_ages[i];
                diff_ages[i] = 0;
            }
        }
    }

    // 结果输出验证
    cout << "最终diff_ages结果:" << endl;
    for (auto val : diff_ages) {
        cout << val << " ";
    }
    cout << endl << "最终cum_age:" << cum_age << endl;
    return 0;
}
逻辑说明
  • 第一轮用for遍历完成初始值计算,同时统计需要补平的总差额cum_age
  • 外层用while循环判断cum_age是否归零,只要还有差额就持续循环处理
  • while内部嵌套for遍历所有diff_ages元素,优先扣减前面的正数值元素,直到累计差额清零
  • 所有计算结果保证diff_ages元素全部≥0,符合需求要求
测试用例运行效果

对应你补充的3元素无筛选测试场景:
初始计算后diff_ages为[0, 0, 91.6],cum_age = 7.7
进入while循环后遍历到第三个元素,91.6 >=7.7,扣减后diff_ages变为[0, 0, 83.9],cum_age归零,循环直接结束

内容的提问来源于stack exchange,提问作者fslack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:00:02