【PAT】【Advanced Level】1081. Rational Sum (20)

xiaoxiao2021-02-27  173

1081. Rational Sum (20)

时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue

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 原题链接:

https://www.patest.cn/contests/pat-a-practise/1081

https://www.nowcoder.com/pat/1/problem/4311

思路:

读入,分母通分,分子相加减,简化结果

CODE:

#include<iostream> #include<cstring> #include<string> #include<cstdlib> using namespace std; int gcd(int a,int b) { if (a<b) swap(a,b); if (a%b==0) return b; else return gcd(max(b,a-b),min(b,a-b)); } int lcm(int a,int b) { return a*b/gcd(a,b); } int main() { int n; cin>>n; int fz=0; int fm=1; for (int i=0;i<n;i++) { string t; cin>>t; int f=0; for (int j=0;j<t.length();j++) { if (t[j]=='/') { f=j; break; } } int a,b; int c=1; if (t[0]=='-') { a=atoi(t.substr(1,f-1).c_str()); c=-1; } else a=atoi(t.substr(0,f).c_str()); b=atoi(t.substr(f+1,t.length()-f-1).c_str()); int g=gcd(a,b); a/=g; b/=g; int l=lcm(fm,b); a*=(l/b); fz*=(l/fm); fm=b=l; if (c==1) fz+=a; else fz-=a; if (fz!=0) { int gc=gcd(abs(fz),fm); fz/=gc; fm/=gc; } //cout<<a<<" "<<b<<" "<<fz<<" "<<fm<<endl; } if (fz==0) { cout<<"0"; } else { if (fz<0) { cout<<"-"; fz*=-1; } if (fz/fm!=0) { cout<<fz/fm; fz%=fm; if (fz!=0) cout<<" "; } if (fz!=0) cout<<fz<<"/"<<fm; } return 0; }

转载请注明原文地址: https://www.6miu.com/read-13857.html

最新回复(0)