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 思路:注意约分就行了#include <stdio.h> int N; struct Node { long long int a,b; }; Node list[110]; long long int gcd(long long int a, long long int b) { if(a < b) { int temp = a; a = b; b = temp; } if(b == 0) { return a; } else { return gcd(b, a % b); } } Node add(long long int a1, long long int b1, long long int a2, long long int b2) { Node res; int fh = 1; res.a = a1 * b2 + a2 * b1; res.b = b1 * b2; if(res.a * res.b < 0) { fh = -1; } if(res.a < 0) { res.a = -res.a; } if(res.b < 0) { res.b = -res.b; } if(res.a != 0) { long long int d = gcd(res.a, res.b); res.a /= d; res.b /= d; res.a *= fh; } return res; } int main() { while(scanf("%d", &N) != EOF) { int fh = 1; for(int i = 0; i < N; i++) { scanf("%lld/%lld", &list[i].a, &list[i].b); fh = 1; if(list[i].a < 0) { list[i].a = -list[i].a; fh = -1; } if(list[i].a != 0) { long long int d = gcd(list[i].a, list[i].b); list[i].a /= d; list[i].b /= d; list[i].a *= fh; } } Node res; res.a = list[0].a; res.b = list[0].b; for(int i = 1; i < N; i++) { Node temp = add(res.a, res.b, list[i].a, list[i].b); res.a = temp.a; res.b = temp.b; } fh = 1; if(res.a * res.b < 0) { fh = -1; } if(res.a < 0) { res.a = -res.a; } if(res.b < 0) { res.b = -res.b; } if(res.a != 0) { long long int d = gcd(res.a, res.b); res.a /= d; res.b /= d; res.a *= fh; if(res.b == 1) { printf("%lld\n", res.a); } else { if(res.a > res.b) { printf("%lld %lld/%lld\n", res.a/res.b, res.a % res.b, res.b); } else { printf("%lld/%lld\n", res.a, res.b); } } } else { printf("0\n"); } } return 0; }