L1-009 N个数求和 (20 分)
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入1:
5
2/5 4/15 1/30 -2/60 8/3
输出:
3 1/3
1结果为整数部分和分数部分
输入2:
2
4/3 2/3
输出2:
2
2结果只有整数部分
输入3:
3
1/3 -1/6 1/8
输出3:
7/24
3结果只有小数部分
代码如下(有详细解释哦~)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long //给long long类型起一个别名 LL
using namespace std;
LL gcd(LL a,LL b)///求最大公约数
{
return a%b==0?b:gcd(b,a%b); //求出a和b的最大公约数,并返回
}
//举例假如输入 3 3/8 1/4 1/16
int main()
{
LL t,a[101],b[101],s1=0,s2=0;
scanf("%lld",&t); //t:输入你要计算的是多少个分数求和
for(int i=0; i<t; i++)
scanf("%lld/%lld",&a[i],&b[i]); //依次输入要计算的分数 3/8 1/4 1/16
s2=b[0]; //第一个分数的分母,8
for(int i=1; i<t; i++)
s2=s2/gcd(s2,b[i])*b[i];///求出所有分数的公分母,即例如 3/8 1/4 gcd反回4 公分母就是(8*4)/4
//s2是所有分数的公分母
for(int i=0; i<t; i++)
s1+=s2/b[i]*a[i];///求分子总和 例如:公分母16 ,(16/8)*3 就是6是第一个分数的分子 (公分母)/分母*分子
//是s1是总的分子
LL n=s1/s2,m=abs(s1%s2); //n就是结果的整数部分, m是余数部分
if(m==0) printf("%lld\n",n); //结果为整数,没有小数部分,直接输出n
else
{
if(n!=0)printf("%lld ",n); //n不为0,有整数部分,输出整数部分
if(s1<0&&n==0)printf("-"); //如果n等于0,且分子是负数,结果为一个负的真分数,输出负号
printf("%lld/%lld\n",m/gcd(s2,m),s2/gcd(s2,m)); //输出分数,例如m是6 6和18的最大公约数是6 6/6=1 18/6=3 即结果1/3
}
return 0;
}