1034 有理数四则运算 (20 point(s))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// 最大公约数 
int gcd(ll a, ll b){
	return b ? gcd(b, a % b) : a;
}

void print(ll a, ll b){
	// 防止除法后分母为负
	if(b < 0) a = -a, b = -b; 
	// 为0情况
	if(a == 0){ cout << 0; return;}
	if(b == 0){ cout << "Inf"; return;}
	// 化为最简形式
	int tmp = abs(gcd(a, b));
	a /= tmp, b /= tmp;
	// 负数的括号
	if(a < 0) cout << '('; 
	if(a % b == 0) cout << a / b;
	else if(abs(a) > abs(b)) cout << a / b << " " << abs(a % b) << '/' << b;
	else if(abs(a) < abs(b)) cout << a << '/' << b;
	if(a < 0) cout << ')'; 
}

int main() {
	ll a1, b1, a2, b2;
	scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
	print(a1, b1); cout << " + "; print(a2, b2); cout << " = "; print(a1 * b2 + a2 * b1, b1 * b2); cout << endl;
	print(a1, b1); cout << " - "; print(a2, b2); cout << " = "; print(a1 * b2 - a2 * b1, b1 * b2); cout << endl;
	print(a1, b1); cout << " * "; print(a2, b2); cout << " = "; print(a1 * a2, b1 * b2); cout << endl;
	print(a1, b1); cout << " / "; print(a2, b2); cout << " = "; print(a1 * b2, b1 * a2); cout << endl;
}

因为 int * int 可能超过 int 的范围 所以需要用 long long。而用 long long 又用 scanf 读取的话,就得用 %lld 否则会读取错误。
参考代码
参考理解

posted on 2021-08-27 19:53  Atl212  阅读(47)  评论(0)    收藏  举报

导航