第一次做估算失误,以为不会溢出,然后就一直分式相乘相加,最大int的100次方,远远溢出,只能边加边化简。
记住题目有个坑的地方,测试点3 分子是-0,而不是0,注意一点。
欧几里得辗转相除法很好用,描述就是 A与B的最大公约数等于 B与A%B的最大公约数。
写成代码就是:
int gcd(int a,int b){
return a==0?b:gcd(b,a%b);
}
附本人AC代码:
#include<iostream>
#include<math.h>
using namespace std;
int gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a%b);
}
void simple(long long&a, long long&b) {
int t = gcd(a, b);
if (t > 0) {
a /= t;
b /= t;
}
}
int main() {
int N, t1, t2;
long long fenzi = 0, fenmu = 1;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d/%d", &t1, &t2);
fenzi = fenzi * t2 + (long long)t1 * fenmu;
fenmu *= (long long)t2;
simple(fenzi, fenmu);
}
if (abs(fenzi) == 0) {
printf("0");
return 0;
}
if (fenzi < 0) {
printf("-");
fenzi *= -1;
}
bool flag = false;
if (fenzi / fenmu > 0) {
printf("%lld", fenzi / fenmu);
flag = true;
}
fenzi -= (fenzi / fenmu)*fenmu;
if (fenzi != 0) {
if (flag)printf(" %lld/%lld", fenzi, fenmu);
else printf("%lld/%lld", fenzi, fenmu);
}
return 0;
}