[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
查看12道真题和解析
嘉士伯公司氛围 613人发布