1081 Rational Sum (20point(s)) - C語言 PAT 甲級

1081 Rational Sum (20point(s))

Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 … where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

Sample Input:

5
2/5 4/15 1/30 -2/60 8/3

Sample Output:

3 1/3

Sample Input:

2
4/3 2/3

Sample Output:

2

Sample Input:

3
1/3 -1/6 1/8

Sample Output:

7/24

題目大意:

輸入 N 個分數,求它們的和

設計思路:
  • 輾轉相除法求兩個數的最大公約數
  • long long 存數據,計算過程中要約分,否則會溢出
編譯器:C (gcc)
#include <stdio.h>

long long gcd(long long a, long long b)
{
        return b == 0 ? a : gcd(b, a % b);
}

int main(void)
{
        int n, i;
        long long sumzi = 0, summu = 1, zi, mu, k;

        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                scanf("%lld/%lld", &zi, &mu);
                sumzi = sumzi * mu + zi * summu;
                summu = summu * mu;
                k = gcd(sumzi, summu);
                sumzi /= k;
                summu /= k;
        }
        k = sumzi / summu;
        sumzi = sumzi % summu;
        if (k != 0 && sumzi != 0)
                printf("%lld %lld/%lld", k, sumzi, summu);
        else if (k == 0 && sumzi != 0)
                printf("%lld/%lld", sumzi, summu);
        else
                printf("%lld", k);

        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章