L1-009 N个数求和(分数20)

题目描述

先给出一个正整数t,随后输入t个数,要求你求出这t个数之和,只不过每个数都是以分式形式给出,要求最后以分式形式输出

例如 输入 : 3/4 14/6
结果 输出 : 37/12

题目思路:

首先,约分输入的分式(输入的可能不是最简式)其次,算出分母的最小公倍数,用公式,不过要注意溢出

然后,算出倍数:

再然后,用倍数乘分子,分子对应相加,再化简。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;

ll gcd(ll a,ll b)
{
	return b == 0 ? a : gcd(b,a%b);
	
}
int main()
{
	ll n,a,b,suma = 0 , sumb = 1,gcdvalue ;
	scanf("%lld" , &n);
	for(int i = 0 ; i < n ; i++)
	{
		scanf("%lld/%lld" , &a,&b);
		
		gcdvalue = (a == 0 || b == 0) ? 1 : gcd(abs(a),abs(b));
		a /= gcdvalue;
		b /= gcdvalue;
		ll lcm = sumb / gcd(sumb,b) * b;
        //防止溢出
		suma = suma * (lcm /sumb) + a * (lcm / b);
		sumb = lcm;
        //加完之后化简,不过会有分子为0的可能
        gcdvalue = (suma == 0 ) ? 1 : gcd(abs(suma),abs(sumb));
		suma /= gcdvalue;
		sumb /= gcdvalue;
		
	}
	ll integer = suma / sumb;
	suma = suma - (sumb * integer);
	// gcdvalue = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma) ,abs(sumb));
	// suma /= gcdvalue;
	// sumb /= gcdvalue;
	if(integer != 0)
	{
		printf("%lld",integer);
		if(suma != 0) printf(" ");
	}
	if(suma != 0) printf("%lld/%lld",suma,sumb);
	if(integer == 0 && suma == 0) printf("0");
	return 0; 
}
posted @ 2026-03-09 12:06  shuiwangrenjia  阅读(2)  评论(0)    收藏  举报