团体程序设计天梯赛 L1-009 N个数求和

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;
}

发布了123 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104907328
今日推荐