题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
注意点
有个地方我一开始没注意,导致分子和分母的正负一直有问题
就是求最大公约数的d时,gcd里面要传绝对值,一定要注意约数的求法!!
Fraction reduction(Fraction a){if(a.down < 0){a.up *= -1;a.down *= -1;}if(a.up == 0) a.down = 1;else {ll d = gcd(abs(a.up), abs(a.down));a.up /= d;a.down /= d;}return a;}
代码
#include<algorithm>#include<vector>#include<iostream>#include<cstdio>using namespace std;typedef long long ll;struct Fraction{ll up, down;};ll gcd(ll a, ll b){return b == 0 ? a : gcd(b, a % b);}Fraction reduction(Fraction a){if(a.down < 0){a.up *= -1;a.down *= -1;}if(a.up == 0) a.down = 1;else {ll d = gcd(abs(a.up), abs(a.down));a.up /= d;a.down /= d;}return a;}Fraction add(Fraction a, Fraction b){Fraction temp;temp.up = a.up * b.down + b.up * a.down;temp.down = a.down * b.down;return reduction(temp);}Fraction minu(Fraction a, Fraction b){Fraction temp;temp.up = a.up * b.down - b.up * a.down;temp.down = a.down * b.down;return reduction(temp);}Fraction multiply(Fraction a, Fraction b){Fraction temp;temp.up = a.up * b.up;temp.down = a.down * b.down;return reduction(temp);}Fraction divide(Fraction a, Fraction b){Fraction temp;temp.up = a.up * b.down;temp.down = a.down * b.up;return reduction(temp);}void show_Fra(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);show_Fra(a);printf(" + ");show_Fra(b);printf(" = ");show_Fra(add(a, b));printf("\n");show_Fra(a);printf(" - ");show_Fra(b);printf(" = ");show_Fra(minu(a, b));printf("\n");show_Fra(a);printf(" * ");show_Fra(b);printf(" = ");show_Fra(multiply(a, b));printf("\n");show_Fra(a);printf(" / ");show_Fra(b);printf(" = ");if(b.up != 0) show_Fra(divide(a, b));else printf("Inf");printf("\n");}
