1081 Rational Sum (20分)

题目

Given N N 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 ) N(\le100) N(100), followed in the next line N N 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 1:

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

Sample Output 1:

3 1/3

Sample Input 2:

2
4/3 2/3

Sample Output 2:

2

Sample Input 3:

3
1/3 -1/6 1/8

Sample Output 3:

7/24

题目大意

分数相加的问题,需要掌握最大公因数和最小公倍数的求法。

坑点

使用long有一个测试点过不了,需要使用long long

代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

long long minf(long long a, long long b){
    long long x = a, y = b, t;
    while(x%y != 0){
        t = x%y;
        x = y;
        y = t;
    }
    return a*b/y;
}

long long maxf(long long a, long long b){
    long long t;
    while(a%b != 0){
        t = a%b;
        a = b;
        b = t;
    }
    return b;
}

int main(){
    int n;
    long long num[100], den[100], in;
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        scanf("%lld/%lld", &num[i], &den[i]);
    long long t = den[0];
    for(int i=1; i<n; i++){
        t = minf(t, den[i]);
    }
    long long c = 0;
    for(int i=0; i<n; i++)
        c += t/den[i]*num[i];
    long long temp = abs(maxf(c, t));
    c /= temp, t /= temp;
    if(c%t == 0){
        printf("%lld\n", c/t);
    }
    else{
        if(c/t != 0)
            printf("%lld ", c/t);
        printf("%lld/%lld\n", c-c/t*t, t);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值