1081 Rational Sum (20分)

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

题意:完全与1088一样,比1088简单~

#include<iostream>

using namespace std;
long long int part, num, den;

int gcd(long long int temp_max, long long temp_min){
    if(temp_max % temp_min == 0){
        return temp_min;
    }else
    {
        return gcd(temp_min, temp_max % temp_min);
    }
    
}

void reform(long long int temp_num, long long int temp_den){
    bool flag = true;
    if((temp_num > 0 && temp_den < 0) || (temp_num < 0 && temp_den > 0)){
        flag = false;
    }
    if(temp_num == 0){
        num = 0;
        den = 0;
    }else
    {
        int max_factor = gcd(temp_num, temp_den);
        temp_num = abs(temp_num / max_factor);
        temp_den = abs(temp_den / max_factor);
        
        if(flag){
            
            part = part + temp_num / temp_den;
            
            num = temp_num - (temp_num / temp_den) * temp_den;
            den = temp_den; 
        }else
        {
            
            part = part - temp_num / temp_den;
            num = (temp_num / temp_den) * temp_den - temp_num;
            den = temp_den; 
    }
    
    }
    
    

    }
    

int main(){

    int n;
    cin >> n;
    part = 0;
    scanf("%lld/%lld", &num, &den);
    for(int i = 1; i < n; i++){
        long long int temp_num, temp_den;
        scanf("%lld/%lld", &temp_num, &temp_den);
        int mm = gcd(temp_num, temp_den);
        temp_num = temp_num / mm;
        temp_den = temp_den / mm;
        num = num * temp_den + temp_num * den;
        den = den * temp_den;
        

    }
    
    reform(num, den);
    if(part == 0){
            if(num == 0){
                printf("0\n");
            }else
            {
                printf("%lld/%lld\n", num, den);
            }
            
    }else
    {
           if(num == 0){
                printf("%lld\n", part);
            }else
            {
                printf("%lld %lld/%lld\n",part, num, den);
            } 
    }
        
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值