有理数四则运算(20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
本题要求编写程序,计算2个有理数的和、差、积、商。
输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分
母不为0。
输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的
最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中
没有超过整型范围的整数。
输入例子:
5/3 0/6
输出例子:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
class Fra
{
    public :
        int u, d;
        Fra(){}
        Fra(int a, int b)
        {
            u = a;
            d = b;
        }
        void gcd()
        {
            int ul = u, dl = d;
            int res;
            if (dl == 0)
            {
                res = 0;
                dl = 1;
            }else
                res = ul % dl;
            while(res != 0)
            {
                ul = dl;
                dl = res;
                res = ul % dl;
            }
            u = u/dl; d = d/dl;
            if (u < 0 && d < 0)
            {
                u = -u; d =-d;
            }else if ((u < 0 && d > 0) || (u > 0 && d < 0))
            {
                u = -abs(u);
                d = abs(d);
            }
  
        }
        void print(ostream& cout)
        {
            if (d == 0)
            {
                cout << "Inf";
                return;
            }
            gcd();
            if (u == 0)
            {
                cout << 0;
                return;
            }
            if (u / d < 0 || u <0)
                cout << "(-";
            if(u/d != 0)
            {
               cout << abs(u/d);
            }
            if (u%d != 0)
            {
                if(u/d != 0)
                    cout << ' ';
                cout << abs(u%d) << '/' << abs(d);
            }
            if (u / d < 0|| u <0)
                cout << ")";
        }
        friend Fra operator+(Fra& a, Fra& b)
        {
            return Fra(a.u*b.d + a.d*b.u, a.d * b.d);
        }  
        friend Fra operator-(Fra& a, Fra& b)
        {
            return Fra( a.u*b.d - a.d*b.u, a.d * b.d);
        }
        friend Fra operator*(Fra& a, Fra& b)
        {
            return Fra(a.u * b.u, a.d*b.d);
        }
        friend Fra operator/(Fra& a, Fra& b)
        {
            return Fra(a.u * b.d, a.d*b.u);
        }     
};
  
int main() {
  
    Fra a, b;
    scanf("%d/%d %d/%d", &(a.u), &(a.d), &(b.u), &(b.d));
    a.print(cout); cout << " + "; b.print(cout); cout << " = "; (a+b).print(cout); cout << endl;
    a.print(cout); cout << " - "; b.print(cout); cout << " = "; (a-b).print(cout); cout << endl;
    a.print(cout); cout << " * "; b.print(cout); cout << " = "; (a*b).print(cout); cout << endl;
    a.print(cout); cout << " / "; b.print(cout); cout << " = "; (a/b).print(cout); cout << endl;
  
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值