1088 Rational Arithmetic (20分)

1088 Rational Arithmetic (20分)
思路:
和1081同一类型,一开始担心超过long long表示范围,就按照1081那样通分计算,写了几十行写不下去了,乖乖看了柳神的(柳神tql),发现是自己想多了。。。
代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
void f(ll t, ll a, ll b) {
	if (b == 0) {
		printf("Inf");
		return;
	}else if (b < 0) {
		a = -a;
		b = -b;
	}

	if (abs(a) >= b) {
		t = a / b;
		a = abs(a % b);
	}
	ll k = gcd(abs(a), b);//  0/0
	a /= k, b /= k;

	if (t > 0) {
		printf("%lld", t);
		if (a) {
			printf(" %lld/%lld", a, b);
		}
	}
	else if (t < 0) {
		if (a) {
			printf("(%lld %lld/%lld)", t, a, b);
		}
		else {
			printf("(%lld)", t);
		}
	}
	else {
		if (a>0) {
			printf("%lld/%lld", a, b);
		}
		else if (a < 0) {
			printf("(%lld/%lld)", a, b);
		}
		else {
			printf("0");
		}
	}
}
int main() {
	ll a1, b1, a2, b2, t1 = 0, t2 = 0;
	scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
	f(t1, a1, b1); printf(" + "); f(t2, a2, b2); printf(" = "); f(0, a1 * b2 + a2 * b1, b1 * b2); printf("\n");
	f(t1, a1, b1); printf(" - "); f(t2, a2, b2); printf(" = "); f(0, a1 * b2 - a2 * b1, b1 * b2); printf("\n");
	f(t1, a1, b1); printf(" * "); f(t2, a2, b2); printf(" = "); f(0, a1 * a2, b1 * b2); printf("\n");
	f(t1, a1, b1); printf(" / "); f(t2, a2, b2); printf(" = "); f(0, a1 * b2, b1 * a2); printf("\n");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值