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/3Sample Output 1:
3 1/3Sample Input 2:
2 4/3 2/3Sample Output 2:
2Sample Input 3:
3 1/3 -1/6 1/8Sample Output 3:
7/24
辗转相除法求最大公约数。
/*2015.7.30cyq*/ #include <iostream> #include <string> using namespace std; long gcd(long a,long b){//辗转相除求最大公约数 long r; while(b!=0){ r=a%b; a=b; b=r; } return a; } void add(long &a,long &b,long &a1,long &b1){ long flag=1; long num=a*b1+a1*b; long den=b*b1; if(num<0){ flag=-1; num=-num; } long g=gcd(num,den); a=flag*num/g; b=den/g; } int main(){ int N; cin>>N; long a1,b1,a,b; scanf("%ld/%ld",&a,&b); for(int i=1;i<N;i++){ scanf("%ld/%ld",&a1,&b1); add(a,b,a1,b1); } if(a==0){ printf("0"); return 0; } if(b==1){ printf("%ld",a); return 0; } if(a/b){//整数部分 printf("%ld ",a/b); a=a%b; } printf("%ld/%ld\n",a,b); return 0; }