您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: