天梯赛L1--009N个数求和(详细注释)

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;  
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值