注意:
(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;
}