C++ Rational类构造函数初始化触发除零错误的原因排查
问题根因分析
1. 约分函数reduction逻辑错误是分母为0的直接原因
你写的约分逻辑存在两处严重错误:
- 把分子分母除以公约数的操作放在了for循环内部,且没有在每次循环重置
gcd变量,只要gcd被赋值过一次,后续每轮循环都会对分子分母做除法,int类型截断最终会把分母变成0 - 没有先遍历所有值找到最大公约数再统一约分,而是边找边除,逻辑完全不符合约分规则
2. 减法函数subtraction计算逻辑错误
现有代码的分子计算两行操作数完全相同,相减后直接为0,不符合分数减法的数学规则a/b - c/d = (a*d - c*b)/(b*d)
修复代码
1. 修复reduction函数
void Rational::reduction() { // 分子为0时直接将分母置为1避免后续运算问题 if (numerator == 0) { denominator = 1; return; } // 取绝对值避免负数影响公约数计算 int n = abs(numerator); int d = abs(denominator); int gcd = 1; int largest = max(n, d); // 先遍历完全部值找到最大公约数再统一做除法 for (int loop = 2; loop <= largest; loop++) { if (n % loop == 0 && d % loop == 0) { gcd = loop; } } numerator /= gcd; denominator /= gcd; // 统一将符号放在分子,分母保持为正 if (denominator < 0) { numerator *= -1; denominator *= -1; } }
2. 修复subtraction函数
Rational Rational::subtraction(const Rational& s) { Rational t; t.numerator = numerator * s.denominator - s.numerator * denominator; t.denominator = s.denominator * denominator; t.reduction(); return t; }
修复后运行效果
你提供的main函数运行后输出为:4/7 + 5/7 = 9/7,符合预期计算结果。
内容的提问来源于stack exchange,提问作者persona
相关产品推荐
相关产品推荐

