题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;//记ll为long long
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
struct Fraction{ //分数
ll up,down; //分子,分母
}a,b;
Fraction reduction(Fraction result){//化简
if(result.down<0){//分母为负数,令分子和分母都变为相反数
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0){//如果分子为0
result.down=1;//令分母为1
}
else{//如果分子不为0,进行约分
int d=gcd(abs(result.up),abs(result.down));//分子分母的最大公约数
result.up/=d;
result.down/=d;
}
return result;
}
Fraction add(Fraction f1,Fraction f2){
Fraction result;
result.up=f1.up*f2.down+f2.up*f1.down;//分数和的分子
result.down=f1.down*f2.down;//分数和的分母
return reduction(result);//返回结果分数,注意化简
}
Fraction minu(Fraction f1,Fraction f2){//分数f1减去分数f2
Fraction result;// 分数差的分子
result.up=f1.up*f2.down-f2.up*f1.down;//分数差的分母
result.down=f1.down*f2.down;//分数和的分母
return reduction(result);//返回结果分数,注意化简
}
Fraction multi(Fraction f1,Fraction f2)//分数f1乘以分数f2
{
Fraction result;
result.up=f1.up*f2.up; //分数积的分子
result.down=f1.down*f2.down; //分数积的分母
return reduction(result);//返回结果分数,注意化简
}
Fraction divide(Fraction f1,Fraction f2){//分数f1除以分数f2
Fraction result;
result.up=f1.up*f2.down;//分数商的分子
result.down=f1.down*f2.up;//分数商的分母
return reduction(result);//返回结果分数,注意化简
}
void showResult(Fraction r){//输出分数x
r=reduction(r);
if(r.up<0) printf("(");
if(r.down==1) printf("%lld",r.up);
else if(abs(r.up)>r.down){
printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);
}
else{
printf("%lld/%lld",r.up,r.down);
}
if(r.up<0)printf(")");
}
int main(){
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
//加法
showResult(a);
printf(" + ");
showResult(b);
printf(" = ");
showResult(add(a,b));
printf("\n");
//减法
showResult(a);
printf(" - ");
showResult(b);
printf(" = ");
showResult(minu(a,b));
printf("\n");
//乘法
showResult(a);
printf(" * ");
showResult(b);
printf(" = ");
showResult(multi(a,b));
printf("\n");
//除法
showResult(a);
printf(" / ");
showResult(b);
printf(" = ");
if(b.up==0) printf("Inf");
else showResult(divide(a,b));
}