如何修正仅支持千位以上输入的C++末位为50取整算法?
修正后的C++算法实现
问题根源分析
原算法核心错误在于错误地以100为单位划分区间并判断进位逻辑,仅在输入值≥1000的部分场景下巧合符合规则,本质逻辑与你定义的匹配规则完全不符:
- 对输入701.272执行
701.272/100=7.01272时,因小数部分<0.5将整数部分加1为8,最终得到8*100+50=850,违背了「[700,750]区间返回750」的要求。 - 即使对于≥1000的输入(如1120),原算法也会错误返回1250而非规则要求的1150。
正确逻辑梳理
根据你定义的规则,末位为50的匹配值(50、150、250...)的区间划分可统一为:
- 输入值落在
[50*(2n+1), 50*(2n+2))(n为整数)时,返回50*(2n+1)(例:[1050,1100)返回1050) - 输入值落在
[50*(2n+2), 50*(2n+3)]时,返回50*(2n+3)(例:[1100,1150]返回1150)
修正后的算法步骤
- 将输入的float值除以50.0,得到浮点数值
- 提取该数值的整数部分
- 判断整数部分的奇偶性:
- 若为奇数:直接返回「50 × 整数部分」
- 若为偶数:返回「50 × (整数部分 + 1)」
C++代码实现
float getNearest50(float input) { float val = input / 50.0f; int int_val = static_cast<int>(val); // 处理刚好等于50*(奇数)的边界情况(如1150=50*23) if (val == static_cast<float>(int_val) && int_val % 2 == 1) { return 50.0f * int_val; } return (int_val % 2 == 1) ? 50.0f * int_val : 50.0f * (int_val + 1); }
测试验证
- 输入701.272 →
701.272/50=14.02544,整数部分14为偶数 → 返回50*(14+1)=750(正确) - 输入1060 →
1060/50=21.2,整数部分21为奇数 → 返回50*21=1050(正确) - 输入1120 →
1120/50=22.4,整数部分22为偶数 → 返回50*(22+1)=1150(正确) - 输入1150 →
1150/50=23,整数部分23为奇数 → 返回50*23=1150(正确) - 输入50 →
50/50=1,整数部分1为奇数 → 返回50*1=50(正确) - 输入100 →
100/50=2,整数部分2为偶数 → 返回50*(2+1)=150(正确)
内容的提问来源于stack exchange,提问作者VansFannel
相关产品推荐
相关产品推荐

