#include <iostream>
#include <cmath>
using namespace std;
long long a, b, c, d;
long long gcd(long long t1, long long t2) { //求最大公因数
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
void func(long long m, long long n) { //化简成真分数函数
if (m * n == 0) { //先看m和n里面是否有0,如果分母n=0,输出Inf,如果分子m=0,输出"0"
printf("%s", n == 0 ? "Inf" : "0");
return ;
}
bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0)); //m n是否异号决定是否要输出()和-
m = abs(m); n = abs(n);
long long x = m / n;
printf("%s", flag ? "(-" : "");
if (x != 0) printf("%lld", x); //整数部分非零则输出
if (m % n == 0) { //m n能整除则不用输出了
if(flag) printf(")");
return ;
}
if (x != 0) printf(" "); //整数部分和真分数部分的空格
m = m - x * n; //真分数的分子
long long t = gcd(m, n);
m = m / t; n = n / t; //分子分母同除最大公因数化简
printf("%lld/%lld%s", m, n, flag ? ")" : "");
}
int main() {
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n"); //结果都是分数形式最后化简
func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
return 0;
}
PAT 1034 有理数四则运算 (20 分)
最新推荐文章于 2024-08-07 12:43:42 发布