1034 有理数四则运算

题目链接:

分析:
本题是一道模拟题,码量大,较为繁琐,且题目只说明分子和分母全是整型范围内的整数,需要开到long long.

其中qcd表示计算分子分母的最大公约数。值得注意的是,通过观察本题结构可以发现,加减乘除四则运算在输出时,均需要将分数式化简,因此不如直接构造一个函数用来实现将分数式化至最简的功能,即turn函数。
易错点:

  • 1:加减乘除运算必须在代码中通过通分来实现,(C/C++中/的结果直接保留为整数)
  • 2:在turn函数中实现对a, b化简除以其最大公约数时,错误样例:
a = a / qcd(a, b);
b = b / qcd(a, b);

原因是在第一行之后a的值已经发生了变动!
正确代码:

int x = qcd(a, b);
a = a / x;
b = b / x;

以下是我的完整AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qcd(ll a, ll b){
    ll r;
    if (b == 0) return a;
    else {
        r = qcd(b, a % b);
        return r;
    }
}

void turn(ll a, ll b){
	ll x = qcd(a, b);
    a = a / x; 
    b = b / x; 
    ll flag = 1;
    if ((a < 0 && b > 0) || (a > 0 && b < 0)) {
        cout << "(-";
        flag = 0;
    }
    a = abs(a);
    b = abs(b);
    if (b == 0) {
    	cout << "Inf"; return ;
	}
    if (a == 0) {
    	cout << "0"; return ;
	}
    if (b == 1 && flag == 0) {
        cout << a << ")";return ;
    }
    if (b == 1 && flag == 1) {
    	cout << a; return ;
	}
    else {
        ll x = a / b;
        if (x > 0 && flag == 1) cout << x << ' ' << a - b * x<< '/' << b;
        if (x > 0 && flag == 0) cout << x << ' ' << a - b * x<< '/' << b << ')';
        if (x == 0 && flag == 1) cout << a << '/' << b;
        if (x == 0 && flag == 0) cout << a << '/' << b << ')';
    }
}
int main()
{	
    ll a1, b1, a2, b2;
    scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
    turn(a1, b1); cout << " + "; turn(a2, b2); cout << " = "; turn(a1 * b2 + a2 * b1, b1 * b2);puts("");
    turn(a1, b1); cout << " - "; turn(a2, b2); cout << " = "; turn(a1 * b2 - a2 * b1, b1 * b2);puts("");
    turn(a1, b1); cout << " * "; turn(a2, b2); cout << " = "; turn(a1 * a2, b1 * b2);puts("");
    turn(a1, b1); cout << " / "; turn(a2, b2); cout << " = "; turn(a1 * b2, b1 * a2);
    return 0;
}

此处附上柳神的思路和代码:
这种思路和方法更加值得参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值