L1-009 N个数求和

题解
这个题的的思路还是挺简单的,考察的应该是辗转相除法,__gcd()。
但是该题很容易发生溢出,题目也说了分子分母的数据范围在长整型以内,这时首先就需要开 long long,其次倘若直接先求所有分母的最小公倍数,再通分,求所有分子之和,long long 也会溢出的,所以我们必须在输入的时候就进行处理,即每输入一个数,就相加,在进行__gcd()操作,以保证分子、分母都是最简形式,即不会发生溢出。
这一题可能也容易出现浮点错误,/ 0 就是非法操作,需要特判一下,在此我是用问号表达式避免这类问题(主要在__gcd()上)。
#include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; int n; // suma-->分子 // sumb-->分母 ll suma = 0, sumb = 1; int main() { cin >> n; ll x, y, val, tmp; for (int i = 0; i < n; ++i) { scanf("%lld/%lld", &x, &y); // 溢出处理 val = (suma == 0 || sumb == 0) ? 1 : __gcd(abs(suma), abs(sumb)); suma /= val; sumb /= val; suma = x * sumb + y * suma; sumb = sumb * y; } // 还需处理一次 tmp = suma / sumb; suma -= tmp * sumb; // 可能存在还有公约数的情况 val = (suma == 0 || sumb == 0) ? 1 : __gcd(abs(suma), abs(sumb)); suma /= val; sumb /= val; if (tmp) { printf("%lld", tmp); if (suma) { printf(" "); } } if (suma) { printf("%lld/%lld", suma, sumb); } //处理全为 0 的情况 if (tmp == 0 && suma == 0) { puts("0"); } return 0; }

浙公网安备 33010602011771号