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:52/5 4/15 1/30 -2/60 8/3Sample Output 1:3 1/3Sample Input 2:24/3 2/3Sample Output 2:2Sample Input 3:31/3 -1/6 1/8Sample Output 3:7/24#include <cstdio>#include <algorithm>#include <cstring>#include <string>#define Max 111using namespace std;struct Sum{ long long numerator,denominator;}S[Max];long long gcd(Sum a){ long long c,d,e; d=a.numerator; e=a.denominator; if(d<0) d=-d; if(e<0) e=-e; if(e>d) swap(d,e); c=e; while(d%e!=0) { c=d%e; d=e; e=c; } return c;}Sum MikEase( Sum a){ if(a.denominator<0) { a.denominator=-a.denominator; a.numerator=-a.numerator; } if(a.numerator==0) a.denominator=1; else { long long k=gcd(a); a.numerator=a.numerator/k; a.denominator=a.denominator/k; } return a;}Sum Get(Sum a ,Sum b){ a.numerator=a.numerator*b.denominator+b.numerator*a.denominator; a.denominator=a.denominator*b.denominator; return MikEase(a);}int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lld/%lld",&S[i].numerator,&S[i].denominator); if(i>0) S[i]=Get(S[i],S[i-1]); } long long a,b,c=0; a=S[n-1].numerator;b=S[n-1].denominator; if(b==1) PRintf("%lld",a); else { if(abs(a)>abs(b)) { printf("%lld %lld/%lld",a/b,abs(a)%abs(b),b); } else printf("%lld/%lld",a,b); } system("pause"); return 0;}
新闻热点
疑难解答