lyh20021209 2022-05-05 10:00 采纳率: 76.9%
浏览 31
已结题

C++ 分数加法重载 浮点错误

img


代码如下:


#include<iostream>
#include<cmath>
using namespace std;
class FS {
private:
    int fz;
    int fm;
public:
    FS() {};
    FS(int fz, int fm) :fz(fz), fm(fm) {};
    int getFz() {
        return this->fz;
    }
    int getFm() {
        return this->fm;
    }
    FS operator+(const FS& x) {
        FS temp;
        temp.fz = this->fz * x.fm + this->fm * x.fz;
        temp.fm = this->fm * x.fm;
        int a = abs(temp.fz); int b = abs(temp.fm);
        //先保证b是较大的
        if(a>b){
            int temp = b;
            b = a;
            a = temp;
        }
        //辗转相除求最大公约数
        while(b%a!=0){
            int temp = b % a;
            b = a;
            a = temp;
        }
        //约分
        temp.fz/=a;
        temp.fm/=a;
        
        return temp;
    }
};

int main() {
    int n, fz1, fm1, fz2, fm2;
    char a, b;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> fz1 >> a >> fm1 >> b;
        cin >> fz2 >> a >> fm2 >> b;
        FS fs1(fz1, fm1);
        FS fs2(fz2, fm2);
        FS fs3; fs3 = fs1 + fs2;
        if (fs3.getFz() == 0) {
            cout << "0z1m" << endl;
        }
        //把分母的负号给分子
        else if (fs3.getFm() < 0) {
            cout << -fs3.getFz() << "z" << -fs3.getFm() << "m" << endl;
        }
        else if(fs3.getFm()!=0){
            cout << fs3.getFz() << "z" << fs3.getFm() << "m" << endl;
        }
    }
}

这里我保证了b%a!=0,也即a不会为0,为什么会出现浮点错误?

img


注:请不要给我一份AC代码的链接,否则不予采纳

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-05-05 23:25
    关注

    问题就是a等于0了,你可以测试一下0z1m+0z1m,还有1z5m+1z-5m。这两种情况都是分子a等于0,分母b大于0。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 安装gcc遇到的问题
  • ¥15 求购HI3519AV100开发板
  • ¥15 请问1553 RT怎么测试,没有BC有方法吗
  • ¥100 业务编程如何选择学习方向和内容?
  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 【有偿】调用DXGI截图初始化失败,提示0xf 887a0004
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复