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

浙公网安备 33010602011771号