1001.Rational Sum (20)

来源:互联网 发布:酷牛网络我的世界 编辑:程序博客网 时间:2024/04/25 07:18

题目链接:http://www.nowcoder.com/pat/1/problem/4311

时间限制 1000 ms 内存限制 65536 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)

题目描述

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

输入描述:

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.

输出描述:

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.

输入例子:

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

输出例子:

3 1/3

代码 C++:

#include <iostream>int gcd(int a, int b){    if(b==0)    return a>0?a:(a*-1);    return gcd(b,a%b);}int lcm(int a, int b){    return a/gcd(a,b)*b;}int main(){    int N, SumA=0, SumB=1;    scanf("%d",&N);    while(N--){        int a, b, tmp;        scanf("%d/%d",&a,&b);        tmp = lcm(SumB,b);        SumA = SumA*(tmp/SumB)+a*(tmp/b);        SumB = tmp;        tmp = gcd(SumA,SumB);        SumA /= tmp;        SumB /= tmp;    }    if(SumA==0){        printf("0");        return 0;    }    if(SumA>=SumB){        printf("%d",SumA/SumB);        SumA %= SumB;        if(SumA)    printf(" %d/%d",SumA,SumB);    } else if(SumA<=(SumB*-1)){        printf("%d",SumA/SumB);        SumA %= (-1*SumB);        if(SumA)    printf(" %d/%d",SumA,SumB);    }else{        printf("%d/%d",SumA,SumB);    }    return 0;}
0 0
原创粉丝点击