1088 Rational Arithmetic (20分)/分数四则运算

注意

(1)up,down都用long long int 类型
(2)注意判断分母为1的情况
(3)判断up和down是否异号千万不要写成判断up*down是否小于0,因为结果可能超过了long long int的长度,导致溢出大于0,如果这样写的话会有一个测试点无法通过~
(多谢柳神的博客)

#include<iostream>
#include<string>
using namespace std;
long long gcd(long long a, long long b) {
	return !b ? a : gcd(b, a%b);
}
void func(long long up, long long down) { //up、down分别为分子分母
	if (down == 0) {  //特判
		cout << "Inf"; return;
	}
	bool flag = 0;
	if (up > 0 && down < 0 || up < 0 && down>0) {  //不能用up*down<0,因为up*down可能溢出long long范围
		flag = 1; cout << "(-";
	}
	up = abs(up); down = abs(down);
	long long gcdval = gcd(up, down);
	up /= gcdval; down /= gcdval;  //约分
	if (down == 1) cout << up;  //分母为1则输出分子即可
	else {
		if (up / down > 0) cout << up / down << " "; //输出整数部分
		cout << up % down << "/" << down; //输出小数部分
	}
	if (flag) cout << ")"; //输出反括号

}
int main() {
	//freopen("1.txt", "r", stdin);
	long long a, b, c, d;
	scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
	func(a, b); cout << " + "; func(c, d); cout << " = "; func(a*d + b * c, b*d); cout << endl;
	func(a, b); cout << " - "; func(c, d); cout << " = "; func(a*d - b * c, b*d); cout << endl;
	func(a, b); cout << " * "; func(c, d); cout << " = "; func(a * c, b*d); cout << endl;
	func(a, b); cout << " / "; func(c, d); cout << " = "; func(a*d, b*c); cout << endl;
	return 0;
}
发布了62 篇原创文章 · 获赞 7 · 访问量 3128

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104127572
今日推荐