L1-009 N个数求和
题目链接-L1-009 N个数求和
本题的要求很简单,就是求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
- 需要模拟分数加法,每两个分数之间做一次分母通分然后进行运算,化简,不能取n个数分母的最小公倍数,最后再运算化简,否则分母最小公倍数可能会爆long long
- 然后特判一下最后的结果是否可以化为整数
- 如果不能化为整数,继续判断该分数是否是假分数,如果是则需化为带分数
- 具体操作见代码
附上代码
#include<bits/stdc++.h>
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int main(){
ll n;
scanf("%lld",&n);
ll a,b,c,d;
scanf("%lld/%lld",&a,&b);
for(ll i=1;i<n;i++){
scanf("%lld/%lld",&c,&d);
int gcd=__gcd(b,d);
int lcm=b*d/gcd;
a=a*lcm/b+c*lcm/d;
b=lcm;
int m=__gcd(a,b);
a/=m;
b/=m;
}
if(b<0){
a=-a;
b=-b;
}
a%b==0?printf("%lld\n",a/b):a/b==0?printf("%lld/%lld\n",a,b):printf("%lld %lld/%lld",a/b,a-a/b*b,b);
return 0;
}