PAT A1081. Rational Sum (20)

xiaoxiao2021-02-28  119

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/3 Sample Output 1: 3 1/3

Sample Input 2: 2 4/3 2/3 Sample Output 2: 2

Sample Input 3: 3 1/3 -1/6 1/8 Sample Output 3: 7/24

思路:跟PAT A1088 Rational Arithmetic类似,也就是多了一个连续相加的过程

#include<cstdio> #include<iostream> using namespace std; void calculate(long int &A,long int &B,long int a2,long int b2){ long int a,b; a=A;b=B; A=a*b2+a2*b; B=b*b2; }//两个分数加和,非最简 long int common(long int x,long int y){ if(x%y==0) return y; else common(y,x%y); }//选取最大公约数 void simplest(long int &a,long int &b){ long int t=common(a,b); long int num; a/=t;b/=t; if(a<b){ cout<<a<<'/'<<b<<endl; } else if(b==1){ cout<<a<<endl; }//分母为1的情形 else if(a>b){ num=a/b; a-=b*num; cout<<num<<' '<<a<<'/'<<b<<endl; } } void output(long int &a,long int &b){ if(a==0){ cout<<'0'<<endl; return; } if(a<0){ cout<<'-'; a=-a; } simplest(a,b); } int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int N; long int A,B,A2,B2; while(cin>>N){ cin.get(); cin>>A;cin.get();cin>>B; for(int i=1;i<N;i++){ cin>>A2;cin.get();cin>>B2; calculate(A,B,A2,B2);//每重新输入一个分数,都加到第一个分数上 } output(A,B);//将第一个分数输出 } return 0; }
转载请注明原文地址: https://www.6miu.com/read-64772.html

最新回复(0)