1. 程式人生 > >C4top-N個數求和 (分數求和模擬)

C4top-N個數求和 (分數求和模擬)

#include<bits/stdc++.h>
using namespace std;
#define INF 0xfffffff
#define MAXN 1100

struct Node
{
    long long x,y;//分子分母
} a[MAXN];

long long gcd(long long a,long long b)//最大公約數
{
    return (a%b!=0?(gcd(b,a%b)):b);
}
long long lcm(long long a,long long b)//最小公倍數
{
    long long t=gcd(a,b);
    return (a*b/t);
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    long long n;
    cin>>n;
    for(long long i=0; i<n; ++i)
    {
        char str[10];
        cin>>str;
        long long len=strlen(str);
        a[i].x=a[i].y=0;
        long long minu=1;//是否負數
        bool flag=true;
        for(long long j=0; j<len; ++j)
        {
            if(str[j]=='-')
            {
                minu=-1;
                continue;
            }
            if(str[j]=='/')
            {
                flag=false;
                continue;
            }
            if(flag)
            {
                a[i].x*=10;
                a[i].x+=str[j]-'0';
            }
            else
            {
                a[i].y*=10;
                a[i].y+=str[j]-'0';
            }
        }
        if(minu==-1) a[i].x*=minu;//負數
        //cout<<a[i].x<<"/"<<a[i].y<<endl;
        long long t=gcd(a[i].x,a[i].y);
        if(t!=1) a[i].x/=t,a[i].y/=t;
    }
    long long fz=0,fm=0;//分子分母
    if(n==1)//①只有一組資料
    {
        fz=a[0].x,fm=a[0].y;
    }
    else
    {
        fm=lcm(a[0].y,a[1].y);
        for(long long i=1; i<n; ++i)
        {
            long long t=lcm(fm,a[i].y);
            fm=t;
        }
        //cout<<lc<<endl;
        fz=0;//分子
        for(long long i=0; i<n; ++i)
        {
            long long t=fm/a[i].y;
            a[i].y*=t;
            a[i].x*=t;
            fz+=a[i].x;
            //cout<<a[i].x<<"/"<<a[i].y<<endl;
        }
    }
    if(fz==0)//②分子為0,結果為0
    {
        cout<<"0"<<endl;
    }
    else
    {
        long long ans=fz/fm;
        //cout<<ans<<endl;
        if(ans)//③假分數
        {
            fz-=ans*fm;
            if(fz==0)
            {
                cout<<ans<<endl;
            }
            else
            {
                long long t=gcd(fz,fm);
                fz/=t,fm/=t;
                cout<<ans<<" "<<fz<<"/"<<fm<<endl;
            }
        }
        else//④真分數
        {
            long long t=gcd(fz,fm);
            fz/=t,fm/=t;
            cout<<fz<<"/"<<fm<<endl;
        }
    }
    return 0;
}