[PAT-A 1088] Rational Arithmetic

在这里插入图片描述
在这里插入图片描述
题目大意:
在一行中按照a1/b1 a2/b2给出两个分数的有理数,其中分子分母均是整型范围内的整数,负号在分子前,分母不为0,
求这两个分数的加法,减法,乘法,除法的计算式,如果是假分数,则按带分数的形式输出,如果是整数,则输出整数,否则输出真分数,
如果除数为0,输出INF。

思路:
常规的分数四则运算
注意每一步都要约分,计算最大公约数时使用绝对值。
使用long long 类型,使用int会分母相乘会溢出。

AC代码:

//PAT_A 1088
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
	if (b == 0)return a;
	else return gcd(b, a % b);
}
struct Fraction {
	ll up, down;
};
Fraction reduction(Fraction result) {
	if (result.down < 0) {
		result.up = -result.up;
		result.down = -result.down;
	}
	if (result.up == 0)result.down = 1;
	else {
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}
Fraction add(Fraction a, Fraction b) {
	Fraction result;
	result.up = a.up * b.down + a.down * b.up;
	result.down = a.down * b.down;
	return(reduction(result));
}
Fraction minu(Fraction a, Fraction b) {
	Fraction result;
	result.up = a.up * b.down - a.down * b.up;
	result.down = a.down * b.down;
	return(reduction(result));
}
Fraction multi(Fraction a, Fraction b) {
	Fraction result;
	result.up = a.up * b.up;
	result.down = a.down * b.down;
	return(reduction(result));
}
Fraction divide(Fraction a, Fraction b) {
	Fraction result;
	result.up = a.up * b.down;
	result.down = a.down * b.up;
	return(reduction(result));
}
void showResult(Fraction r) {
	r = reduction(r);
	if (r.up < 0)printf("(");
	if (r.down == 1)printf("%lld", r.up);
	else if (abs(r.up) > r.down)printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
	else printf("%lld/%lld", r.up, r.down);
	if (r.up < 0)printf(")");
}
int main() {
	Fraction a, b;
	(void)scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
	showResult(a);
	printf(" + ");
	showResult(b);
	printf(" = ");
	showResult(add(a, b));

	printf("\n");
	showResult(a);
	printf(" - ");
	showResult(b);
	printf(" = ");
	showResult(minu(a, b));

	printf("\n");
	showResult(a);
	printf(" * ");
	showResult(b);
	printf(" = ");
	showResult(multi(a, b));

	printf("\n");
	showResult(a);
	printf(" / ");
	showResult(b);
	printf(" = ");
	if (b.up == 0)printf("Inf");
	else showResult(divide(a, b));
	return 0;
}
发布了142 篇原创文章 · 获赞 1 · 访问量 4578

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104274342