[PAT解题报告] Rational Sum
简单题,有理数(分数)求和。
主要掌握两个分数求和就行了,
a / b + c / d = (a * d + b * c) / (b * d)
每次约分一下,求最大公约数(***)就好了。我保证了分母总是正数,分子任意……
还有建议用long long因为乘法可能很大的。
最终输出是带分数,可能整数部分是0, 也可能分数部分是0,要详细判断一下。
代码:
#include <cstdio> #include <cstring> #include <string> using namespace std; char s[111]; long long ***(long long x,long long y) { return y?***(y, x % y):x; } int main() { long long a = 0, b = 1; //a / b int n; for (scanf("%d",&n);n;--n) { scanf("%s",s); char *t = strstr(s,"/"); if (t) { *t = ' '; } long long c, d; sscanf(s,"%lld%lld",&c,&d); // a / b + c / d long long aa = a * d + b * c; long long bb = b * d; long long g = ***((aa < 0)?(-aa):aa, bb); a = aa / g; b = bb / g; } long long x = a / b, y = a % b; if (y == 0) { printf("%lld\n",x); } else { if (x) { printf("%lld ",x); } printf("%lld/%lld\n",y,b); } return 0; }
原题链接: http://www.patest.cn/contests/pat-a-practise/1081