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
相关产品推荐
相关产品推荐

