没做出来,看dalao的,dalao超巨。
注意的点: 分子0的处理/计算公约数的时候取正不然会改变正负性
reduction为核心方法
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct Fraction{
ll fenzi,fenmu;
};
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
//化简
Fraction reduction(Fraction a){//来到这个函数的时候a的分子分母正负都是随意的
if(a.fenmu < 0){
a.fenzi = -a.fenzi;
a.fenmu = -a.fenmu;
}
if(a.fenzi == 0) a.fenmu = 1;
else{
ll gy = abs(gcd(a.fenzi,a.fenmu));//取正 才不会改变分子分母的符号
a.fenmu /= gy;
a.fenzi /= gy;
}
return a;
}
//加法
Fraction add(Fraction &a,Fraction &b){
Fraction c;
c.fenzi = a.fenzi*b.fenmu + a.fenmu*b.fenzi;
c.fenmu = a.fenmu*b.fenmu;
return reduction(c);
}
//减法
Fraction sub(Fraction &a,Fraction &b){
Fraction c;
c.fenzi = a.fenzi*b.fenmu - a.fenmu*b.fenzi;
c.fenmu = a.fenmu*b.fenmu;
return reduction(c);
}
//乘法
Fraction muti(Fraction &a,Fraction &b){
Fraction c;
c.fenzi = a.fenzi * b.fenzi;
c.fenmu = a.fenmu * b.fenmu;
return reduction(c);
}
//除法
Fraction divide(Fraction &a,Fraction &b){
Fraction c;
c.fenzi = a.fenzi * b.fenmu;
c.fenmu = b.fenzi * a.fenmu;
return reduction(c);
}
//打印结果
void print(Fraction a){//来到这里的时候是最简式分子为正/负 分母为正 可能是假分式/真分式
if(a.fenzi < 0) printf("(");//负数加括号
if(a.fenmu == 1) printf("%lld",a.fenzi);//如果是整数 只打印分子
else if(abs(a.fenzi) > abs(a.fenmu)) printf("%lld %lld/%lld",a.fenzi/a.fenmu,abs(a.fenzi)%a.fenmu,a.fenmu);//如果是假分式
else printf("%lld/%lld",a.fenzi,a.fenmu);
if(a.fenzi < 0) printf(")");//负数加括号
}
int main(){
Fraction a,b;
scanf("%lld/%lld %lld/%lld",&a.fenzi,&a.fenmu,&b.fenzi,&b.fenmu);
//将a化简
a=reduction(a);
b=reduction(b);
//加法
print(a);
printf(" + ");
print(b);
printf(" = ");
print(add(a,b));
printf("\n");
//减法
print(a);
printf(" - ");
print(b);
printf(" = ");
print(sub(a,b));
printf("\n");
//乘法
print(a);
printf(" * ");
print(b);
printf(" = ");
print(muti(a,b));
printf("\n");
//除法
print(a);
printf(" / ");
print(b);
printf(" = ");
if(b.fenzi == 0) printf("Inf");
else print(divide(a,b));
printf("\n");
return 0;
}
标签:有理数,四则运算,fenmu,Fraction,printf,print,fenzi,1034,lld
From: https://www.cnblogs.com/chengyiyuki/p/18141243