//1034
#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){
printf("%s",n==0?"Inf":"0");
return;
} //分母为0则输出inf
bool flag=((m<0&&n>0)||(m>0&&n<0));//flag为1 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){
if(flag) printf(")");//可以化简为整数且为负数就加上右括号
return;
}
if(x!=0) printf(" ");//
m=m-n*x;
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+c*b,b*d);printf("\n");
func(a,b);printf(" - ");func(c,d);printf(" = ");func(a*d-c*b,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;
}
这道题毫无头绪,然后参考的liuchuo的代码,核心就是分数的化简func函数。
参考:
liuchuo-github