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

kewlgrl發表於2017-03-24
N個數求和   

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。

輸入格式:

輸入第一行給出一個正整數N\le100)。隨後一行按格式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
 
  • 時間限制:400ms
  • 記憶體限制:64MB
  • 程式碼長度限制:16kB
  • 判題程式:系統預設
  • 作者:陳越
  • 單位:浙江大學

題目判定

解題思路
我的思路就是先把所有分數通分,然後計算他們分子的和,最後分情況討論是否假分數。
注意兩個坑點:①分子為0;②只有一組測試資料。

解題程式

#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;
}



相關文章