【PAT-A1081】Rational Sum(分数运算)

【题意】

就简单的分数加法运算,之前做过一题更难的。不过这里就是要注意输入得到的值不标准,要reduction一下,而且明白了reduction中为什么在分数为0的时候把分母设为1,这是因为0参与的加减法运算不会错。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
struct Fraction
{
	LL up;
	LL down;
};

LL gcd(LL a, LL b) {
	if (b == 0) return a;
	return gcd(b, a % b);
}

Fraction reduction(Fraction a) {
	if (a.down < 0) {
		a.up = -a.up;
		a.down = -a.down;

	}
	if (a.up == 0) {
		a.down = 1;
	}
	else {
		LL d = abs(gcd(a.up, a.down));
		a.up /= d;
		a.down /= d;
	}
	return a;
}

Fraction add(Fraction& a, Fraction& b) {
	Fraction res;
	res.up = a.up * b.down + a.down * b.up;
	res.down = a.down * b.down;
	return reduction(res);
}

Fraction sub(Fraction& a, Fraction& b) {
	Fraction res;
	res.up = a.up * b.down - a.down * b.up;
	res.down = a.down * b.down;
	return reduction(res);
}

Fraction multi(Fraction& a, Fraction& b) {
	Fraction res;
	res.up = a.up * b.up;
	res.down = a.down * b.down;
	return reduction(res);
}

Fraction div(Fraction& a, Fraction& b) {
	Fraction res;
	if (b.up == 0) {
		res.down = 0;
		res.up = 1;
		return res;
	}
	res.up = a.up * b.down;
	res.down = a.down * b.up;
	return reduction(res);
}

void transPrint(Fraction& a) {
	if (a.down == 0) {
		printf("Inf");
		return;
	}

	if (a.down == 1) {
		printf("%lld", a.up);
	}
	else if (abs(a.up) > a.down)
	{
		printf("%lld %lld/%lld", a.up / a.down, abs(a.up) % a.down, a.down);
	}
	else {
		printf("%lld/%lld", a.up, a.down);
	}


}

int main() {
	int n;
	scanf("%d", &n);
	Fraction a, ans;
	ans.up = 0;
	ans.down = 1;
	for (int i = 0; i < n; i++)
	{
		scanf("%lld/%lld", &a.up, &a.down);
		a = reduction(a);
		ans = add(ans, a);
	}
	transPrint(ans);
	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值