有理数四则运算

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:

输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:

分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:

2/3 -4/2

输出样例 1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例 2:

5/3 0/6

输出样例 2:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

注意:在进行乘法运算时可能会超出int,所以改用long long int。

#include<cstdio>
#include<iostream>

using namespace std;
long long int a, b, c, d;

long long int gcd(long long int p,long long int q) {
    return q == 0 ? p : gcd(q,p % q);
}

void func(long long int x,long long int y) {
    int flag1 = 0, flag2 = 0;
    if (x == 0) {
        cout << '0';
        return;
    }
    if (y == 0) {
        cout << "Inf";
        return;
    }

    if (x < 0) {
        flag1 = 1;
        x = 0 - x;//把负数转化为正数
    }
    if (y < 0) {
        flag2 = 1;
        y = 0 - y;
    }
    int flag = 0;
    if (flag1 == 1 && flag2 == 1)
        flag = 0;
    else if (flag1 == 1 || flag2 == 1)
        flag = 1;
    //确定符号
    long long int m = x / y, n = x%y;//分别是整数部分和分子

    long long int a1 = n, a2 = y;
    long long int p = gcd(a1,a2);

    n = n / p;
    y = y / p;

    if (n == 0) {
        if (flag == 1) cout << "(-" << m<<")";
        else cout << m;
    }//所得的结果为整数
    if (n != 0) {
        if (flag == 1) {
            cout <<"(-";
            if (m != 0)
                cout << m << " ";
            cout << n << '/' << y;
            cout << ")";
        }
        else {
            if (m != 0)
                cout << m << " ";
            cout << n << '/' << y;
        }
    }
}
void add() {
    long long int f1, f2;
    f1 = a*d + c*b;
    f2 = b*d;
    func(a, b);
    cout << " " << '+' << " ";
    func(c, d);
    cout << " " << '=' << " ";
    func(f1, f2);
}

void mins() {
    long long int f1, f2;
    f1 = a*d - b*c;
    f2 = b*d;
    func(a, b);
    cout << " " << '-' << " ";
    func(c, d);
    cout << " " << '=' << " ";
    func(f1, f2);
}

void mul() {
    long long int f1, f2;
    f1 = a*c;
    f2 = b*d;
    func(a, b);
    cout << " " << '*' << " ";
    func(c, d);
    cout << " " << '=' << " ";
    func(f1, f2);
}

void divide() {
    long long int f1, f2;
    f1 = a*d;
    f2 = b*c;
    func(a, b);
    cout << " " << '/' << " ";
    func(c, d);
    cout << " " << '=' << " ";
    func(f1, f2);
}
int main() {
    scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
    add();
    cout << endl;
    mins();
    cout << endl;
    mul();
    cout << endl;
    divide();
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值