首页 > 学院 > 开发设计 > 正文

N个数求和

2019-11-08 01:07:32
字体:
来源:转载
供稿:网友
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤/le≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

52/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

24/3 2/3

输出样例2:

2

输入样例3:

31/3 -1/6 1/8

输出样例3:

7/24#include<stdio.h>long long gcd_gcd(long long x,long long y) //求最大公约数{    int xy=1;    while(xy)    {        xy=x%y;        x=y;        y=xy;    }    return x;}long long lcm_lcm(int a,int b) //求最小公倍数{    long long gcd;    gcd=gcdgcd(a,b);    return a*b/gcd;}int main(){    long long fz[100],fm[100];    int i,j,n;    long long ffz,ffm,lcm,gcd,mul1,mul2,zhen;    scanf("%d",&n);    for(i=0;i<n;i++)    {        scanf("%lld/%lld",&fz[i],&fm[i]);    }    ffz=fz[0]; //对ffz和ffm赋初值,然后用for循环依次与后面的分数相加    ffm=fm[0];    for(i=1;i<n;i++) //加上后面的分数    {        lcm=lcm_lcm(ffm,fm[i]); //ffm代表的是前i项的分母,ffm[i]代表的是第i项的分母        mul1=lcm/ffm*ffz;         mul2=lcm/fm[i]*fz[i];        ffz=mul1+mul2;        ffm=lcm;        gcd=gcd_gcd(ffz,ffm); //        ffz/=gcd; // 将得到的最新的分数约分,否则数会过大        ffm/=gcd; //    }    if(!ffz) //若分子为0    {        PRintf("0/n");    }    else    {        gcd=gcd_gcd(ffz,ffm);         ffz/=gcd;        ffm/=gcd;        zhen=ffz/ffm; //求真数        if(!zhen) //真数为0,说明分数小于1,没有真数         {            printf("%lld/%lld/n",ffz,ffm);        }        else        {            ffz-=(zhen*ffm);            if(ffz!=0)             {                printf("%lld %lld/%lld/n",zhen,ffz,ffm);            }            else //此时分数正好为1            {                printf("%lld/n",zhen);            }        }    }    return 0;}
上一篇:原类

下一篇:洛谷P1303 A*B Problem

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表