N个数求和

来源:互联网 发布:levered beta知乎 编辑:程序博客网 时间:2024/06/05 14:12
#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=gcd_gcd(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项的分母,fm[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;
}


0 0
原创粉丝点击