1034 有理数四则运算
这是一种套路题,需要记住大体流程,然后反复练习。
注意点:
因为题目给出的整数可能超过int范围,所以整数都必须用long long型存放,不然最后两个测试点过不去。
#include<iostream> #include<algorithm> using namespace std; typedef long long LL; struct Fraction { LL fenzi,fenmu; }; LL gcd(LL a,LL b) { //这里必须用long long类型,因为给出的分子分母可能超出int,导致测试点3,4无法通过 return b == 0?a:gcd(b,a%b); } Fraction reduction(Fraction a) {//化简 if(a.fenmu < 0) {//分母是负数,分子分母全部取反 a.fenzi = -a.fenzi; a.fenmu = -a.fenmu; } if(a.fenzi == 0) a.fenmu = 1;//分数是0,就令分子为0,分母为1 else {//求出分子和分母绝对值的最大公约数 d LL d = gcd(abs(a.fenzi),abs(a.fenmu)); a.fenzi /= d; a.fenmu /= d; } return a; } //加法 Fraction add(const Fraction& a,const 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(const Fraction& a,const 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(const Fraction& a,const Fraction& b) { Fraction c; c.fenzi = a.fenzi*b.fenzi; c.fenmu = a.fenmu*b.fenmu; return reduction(c); } //除法 Fraction divide(const Fraction& a,const Fraction& b) { Fraction c; c.fenzi = a.fenzi*b.fenmu; c.fenmu = a.fenmu*b.fenzi; return reduction(c); } //打印输出 void print(Fraction a) { if(a.fenzi < 0) printf("("); if(a.fenmu == 1) printf("%lld",a.fenzi);//如果是整数,即分母为1 else if(abs(a.fenzi) > 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 = reduction(a);//化简a b = reduction(b);//化简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; }