题目链接:点击打开链接
知识点笔记:
AC代码:
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
struct Fraction{
ll up,down; //分子 分母
};
//求最大公约数
ll gcd(ll a,ll b){
if(b==0) return a;
else return gcd(b,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;
}
//分数的输出
void showResult(Fraction r){
r = reduction(r);
if(r.up<0) printf("(");
if(r.down==1) printf("%lld",r.up);
else if(abs(r.up)>abs(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(")");
}
//分数的加法
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){
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){
Fraction result;
result.up=f1.up*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
//分数的除法
Fraction divide(Fraction f1,Fraction f2){
Fraction result;
result.up=f1.up*f2.down;
result.down=f1.down*f2.up;
return reduction(result);
}
int main() {
Fraction f1,f2;
f1=reduction(f1);
f2=reduction(f2);
scanf("%lld/%lld %lld/%lld",&f1.up,&f1.down,&f2.up,&f2.down);
showResult(f1);
printf(" + ");
showResult(f2);
printf(" = ");
showResult(add(f1,f2));
printf("\n");
showResult(f1);
printf(" - ");
showResult(f2);
printf(" = ");
showResult(minu(f1,f2));
printf("\n");
showResult(f1);
printf(" * ");
showResult(f2);
printf(" = ");
showResult(multi(f1,f2));
printf("\n");
showResult(f1);
printf(" / ");
showResult(f2);
printf(" = ");
if(f2.up==0) printf("Inf");
else showResult(divide(f1,f2));
return 0;
}