L1-009 N個數求和 (20分)
本題的要求很簡單,就是求 \(N\) 個數字的和,麻煩的是,這些數字是以有理數 分子/分母 的形式給出的,你輸出的和也必須是有理數的形式,
輸入格式:
輸入第一行給出一個正整數 \(N \; (\leq 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
解題思路:
每次讀入 分子 除號 分母,與之前的結果通分相加,然后記錄新的結果并約分,之后按要求輸出即可,
\(\color{red}{Ps.}\)
1. 結果為整數時,不輸出中間的空格及分數部分
2. 結果小于 \(1\) 時,不輸出整數部分及中間的空格
代碼:
#include<bits/stdc++.h>
using namespace std;
int n,a,b,up,down=1;
char c;
int main()
{
cin>>n;
while(n--)
{
cin>>a>>c>>b;
up=up*b+a*down; /*通分*/
down*=b;
int k=abs(__gcd(up,down));
up/=k; /*約分*/
down/=k;
}
if(up%down==0)cout<<up/down<<endl; /*結果為整數*/
else
{
if(up/down)cout<<up/down<<' '; /*結果大于1*/
cout<<up-up/down*down<<'/'<<down<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/51069.html
標籤:C++
