您的位置:首页 > 其它

L1-009. N个数求和 - PAT

2018-03-25 20:48 274 查看

L1-009. N个数求和

时间限制400 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者陈越
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(<=100)。随后一行按格式“a1/b1 a2/b2 ...”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。输出格式:输出上述数字和的最简形式 —— 即将结果写成“整数部分 分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
分析:
提交的时候一直出现浮点错误,原因是long long型也可能超范围!所以要先化简再相加,再化简。(有可能题上给的两个加数是非常大的没有化简的数,所以一相加时就会超范围,所以加前也要化简)
当时写的时候还考虑两个数的正负情况,现在看来不用考虑,因为所有的负的加数都是分子是负的,所以分母一直为正。
代码如下:#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int gcd(long long x,long long y){
if(x<y){
int tmp=x;
x=y;
y=tmp;
}
int z;
while(x%y!=0){
z=x%y;
x=y;
y=z;
}
return y;
}

void sum(long long &x,long long &y,long long a,long long b){
long long m=gcd(a,b);
a/=m;b/=m;
if(x==0){
x=a;
y=b;
}
else {
x=x*b+a*y;
y=y*b;
}
}

int main(){
long long a,n,b,x=0,y=0;
scanf("%lld",&n);
while(n--){
scanf("%lld/%lld",&a,&b);
sum(x,y,a,b);
int m=gcd(x,y);
x/=m;y/=m;
}

if(x%y==0){
printf("%d\n",x/y);
}
else{
int k=0;
long long m=x/y;
if(m==0){
printf("%lld/%lld\n",x,y);
}
else{
printf("%lld %lld/%lld\n",m,x-y*m,y);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: