题目很简单,就是针对分数的四则运算输出结果,代码也很容易理解,注意一些细节容易出错:
1.分数化简,涉及到最大公约数
2.负数的表示
3.带分数的形式输出
分数的四则运算理解这道例题就足够了
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
struct Fraction{
ll up;//分子
ll down;//分母
}a,b;
Fraction reduction(Fraction res){
if(res.down<0){ //保证分母为正数
res.up=-res.up;
res.down=-res.down;
}
if(res.up==0){ //如果分子为0,令分母为1
res.down=1;
}else{
int t=gcd(abs(res.up),abs(res.down));//最大公约数
res.up/=t;
res.down/=t;
}
return res;
}
Fraction add(Fraction f1,Fraction f2){
Fraction res;
res.up=f1.up*f2.down+f2.up*f1.down;
res.down=f1.down*f2.down;
return reduction(res);
}
Fraction minu(Fraction f1,Fraction f2){
Fraction res;
res.up=f1.up*f2.down-f2.up*f1.down;
res.down=f1.down*f2.down;
return reduction(res);
}
Fraction multi(Fraction f1,Fraction f2){
Fraction res;
res.up=f1.up*f2.up;
res.down=f1.down*f2.down;
return reduction(res);
}
Fraction divide(Fraction f1,Fraction f2){
Fraction res;
res.up=f1.up*f2.down;
res.down=f1.down*f2.up;
return reduction(res);
}
void showResult(Fraction res){
res=reduction(res);
if(res.up<0) printf("(");
if(res.down==1){
printf("%lld",res.up);
}else if(abs(res.up)>res.down){
printf("%lld %lld/%lld",res.up/res.down,abs(res.up)%res.down,res.down);
}else{
printf("%lld/%lld",res.up,res.down);
}
if(res.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));
printf("\n");
return 0;
}