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;
}

 

posted @ 2020-10-28 10:34  Fool_one  阅读(175)  评论(0)    收藏  举报