PAT甲级——【牛客练习题100】
题目描述
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
1 #include <iostream> 2 #include <vector> 3 #include <math.h> 4 5 using namespace std; 6 7 long int gcd(long int a, long int b) 8 { 9 if(b==0) return a; 10 else return gcd(b,a%b); 11 } 12 13 int main() 14 { 15 double N; 16 cin>>N; 17 long int Inter = 0;//整数 18 long int resa = 0;//答案分子 19 long int resb = 1;//答案分母 20 21 for(int i=0;i<N;++i) 22 { 23 long int a = 0;//输入分子 24 long int b = 0;//输入分母 25 char c; 26 cin >> a >> c >> b; 27 28 int f = 1; 29 if(a<0) 30 { 31 a = a*-1; 32 f = -1; 33 } 34 Inter += a/b; //简化 35 a = a-b*(a/b); 36 37 long int Div = 0;//最大公约数 38 long int Mul = 0;//最小公倍数 39 //化简输入的分数 40 Div = gcd(b,a); 41 a = a/Div; 42 b = b/Div; 43 44 //求最大公倍数 45 if(resb > b) 46 { 47 Div = gcd(resb,b); 48 Mul = resb / Div * b; 49 } 50 else 51 { 52 Div = gcd(b, resb); 53 Mul = b / Div * resb; 54 } 55 //相加 56 resa = resa * (Mul/resb) + f * a * (Mul/b); 57 resb = Mul; 58 //化简有理数 59 Inter += resa / resb; 60 resa = resa - (resa / resb)*resb; 61 62 //化简最简分数 63 Div = gcd(resb, fabs(resa)); 64 resa = resa/Div; 65 resb = resb/Div; 66 } 67 if(Inter==0 && resa==0) 68 cout << 0 << endl; 69 else if(Inter != 0 && resa == 0) 70 cout << Inter << endl; 71 else if(Inter == 0 && resa != 0 ) 72 cout << resa << "/" << resb << endl; 73 else 74 cout << Inter << " " << resa << "/" << resb << endl; 75 76 return 0; 77 }