【PAT】【Advanced Level】1081. Rational Sum (20)
2017-08-30 21:53
344 查看
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; }
相关文章推荐
- PAT Advanced Level 1081. Rational Sum (20)
- PAT (Advanced Level) 1081. Rational Sum (20) 分数求和,辗转相除法求gcd
- PAT (Advanced Level) Practise 1081 Rational Sum (20)
- PAT (Advanced Level) Practise 1081 Rational Sum(20)
- PAT (Advanced Level) 1081. Rational Sum (20)
- Pat(Advanced Level)Practice--1081(Rational Sum)
- PAT (Advanced) 1081. Rational Sum (20)
- PAT (Advanced) 1081. Rational Sum (20)
- 【PAT】【Advanced Level】1027. Colors in Mars (20)
- PAT (Advanced Level) 1073. Scientific Notation (20)
- 1031. Hello World for U (20)【字符串处理】——PAT (Advanced Level) Practise
- 1058. A+B in Hogwarts (20)【水题】——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1015. Reversible Primes (20)
- 【PAT】【Advanced Level】1065. A+B and C (64bit) (20)
- 1081. Rational Sum (20)-PAT甲级真题
- PAT (Advanced Level) 1054. The Dominant Color (20) 找过半的数,一次遍历
- PAT (Advanced Level) Practise 1019. General Palindromic Number (20)
- 【c++】PAT (Advanced Level) 1005. Spell It Right (20)
- PAT(Advanced Level)1001. A+B Format (20)
- PAT (Advanced Level)1011. World Cup Betting (20)