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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:18:04