1034 有理数四则运算
这是一种套路题,要先记住大体流程,然后反复练习。
1.分数的表示。
struct Fraction {
long long up,down;//up表示分子,down表示分母
};
规定:
第一点,先使分母非负数,如果分数是负,那么令分子是负的
第二点,如果分数是零,那么令分子是0,分母是1.
第三点,化简分数。
2.分数的化简。
第一点,如果分母为负,那么分子分母取反。
第二点,如果分数是零,那么令分子是0,分母是1.
第三点,求出分子和分母它们绝对值的最大公约数d。然后分子分母除以d。
3.分数的四则运算。
就是数学上分数的一般计算过程。写成四个不同的函数即可,记得返回的结果化简。
4.分数的输出。
第一点,如果分子能被分母整除,就输出整除后的结果,即输出一个整数。
第二点,如果分子的绝对值大于分母,说明这是一个假分数,先输出一个整数,再输出一个正分数。
第三点,一二两点均不满足,说明是一个真分数,直接输出。
#include"cstdio" #include"algorithm" using namespace std; //分数存储结构 struct Fraction { long long up,down;//up表示分子,down表示分母 }; //求最大公约数 long long gcd(long long a,long long b) { return b == 0?a:gcd(b,a%b); } //化简分数 Fraction Reduction(Fraction a) { if(a.down < 0) {//分母是负数,分子分母取反 a.up = -a.up; a.down = -a.down; } if(a.up == 0) a.down = 1;//分数是0 else { long long t = gcd(abs(a.up),abs(a.down)); a.up/=t; a.down/=t; } return a; } //分数加法 Fraction add(Fraction a,Fraction b) { Fraction c; c.up = a.up*b.down+b.up*a.down; c.down = a.down*b.down; return Reduction(c);//结果化简 } //分数减法 Fraction sub(Fraction a,Fraction b) { Fraction c; c.up = a.up*b.down- b.up*a.down; c.down = a.down*b.down; return Reduction(c);//结果化简 } //分数乘法 Fraction multi(Fraction a,Fraction b) { Fraction c; c.up = a.up*b.up; c.down = a.down*b.down; return Reduction(c);//结果化简 } //分数除法。 Fraction divide(Fraction a,Fraction b) { Fraction c; c.up = a.up*b.down; c.down = a.down*b.up;//注意除数分子b.up为0的情况 return Reduction(c) ;//结果化简 } //输出分数 void print(Fraction a) { a = Reduction(a); if(a.up < 0) printf("("); if(a.down == 1) printf("%lld",a.up); else if(abs(a.up)>a.down) printf("%lld %lld/%lld",a.up/a.down,abs(a.up)%a.down,a.down); else { printf("%lld/%lld",a.up,a.down); } if(a.up < 0) printf(")"); } int main() { Fraction a,b; scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down); //分数加法 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(multi(a,b)); printf("\n"); //分数除法 print(a); printf(" / "); print(b); printf(" = "); if(b.up == 0) printf("Inf");//除数是0,特判输出 else print(divide(a,b)); return 0; }