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

输出样例1:
3 1/3

输入样例2:
2
4/3 2/3

输出样例2:
2

输入样例3:
3
1/3 -1/6 1/8

输出样例3:
7/24

第一次提交的时候出现了三种错误
浮点错误:题目说输入数据在long型范围,第一次提交时用的int型,会造成数据溢出而时分母,分子等于0,除以0与取余0都会造成浮点错误;最后结果分子为0时,处理约分时也会有浮点错误
格式错误:x%y 与y%x结果不相同,
答案错误: 解决上面两种错误就没了。

另外记住求最大公约数与最小公倍数的方法。

#include<iostream>

using namespace std;

long yue(long x,long y)
{
    if(x==0||y==0)
        return 0;
    long temp;
    if(x<y)
    {
        temp = x;
        x = y;
        y = temp;
    }
    while(x%y!=0)
    {
        temp = x;
        x = y;
        y = temp%x;
    }
    return y;
}
long bei(long x,long y)
{
    int temp = yue(x,y);
    return x*y/temp;
}
int main()
{
    int N,flag1,flag2;
    long mu1,mu2,zi1,zi2,gong;
    char c;
    cin>>N;
    cin>>zi1>>c>>mu1;

    for(int i = 1;i<N;i++)
    {
        flag1 = 1;   //flag为-1说明分子是负数
        flag2 = 1;
        if(zi1<0)
        {
            flag1 = -1;
            zi1 = zi1*(-1);
        }
        cin>>zi2>>c>>mu2;
         if(zi2<0)
         {
             flag2 = -1;
             zi2 = zi2*(-1);
         }
         gong = bei(mu1,mu2);
         zi1 = gong/mu1*zi1;
         zi2 = gong/mu2*zi2;
         mu1 = gong;
         zi1 = flag1*zi1+flag2*zi2;
    }
    flag1 = 1;
    if(zi1<0)
    {
        flag1 = -1;
        zi1 = zi1*-1;
    }
    if(zi1==0)
    {
        cout<<'0';
        return 0;
    }
    gong = yue(zi1,mu1);
    zi1 = zi1/gong;
    mu1 = mu1/gong;
    if(zi1/mu1!=0)
    {
        if(flag1==-1)
            cout<<"-";
        cout<<zi1/mu1;
    }
    if(zi1/mu1!=0&&zi1%mu1!=0)
        cout<<" ";
    if(zi1%mu1!=0)
    {
        if(flag1==-1)
            cout<<"-";
        cout<<zi1%mu1<<'/'<<mu1;
    }
    if(zi1==0)
        cout<<"0";
    return 0;
}



//浮点错误,当最后结果分子为0时,计算分子分母的最大公约数时会出现浮点错误,即出现%0的情况;题目说明分子分母
//long范围内,用int型可能会溢出,使分母为0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值