天梯賽題目復現7-1 N個數求和 (20 分)
本題的要求很簡單,就是求N
個數字的和。麻煩的是,這些數字是以有理數分子/分母
的形式給出的,你輸出的和也必須是有理數的形式。
輸入格式:
輸入第一行給出一個正整數N
(
≤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:
輸入樣例3:
3 1/3 -1/6 1/8
輸出樣例3:
7/24
本題求n個分數的和,分數是以分子/分母格式給出,顯然可以想到可以同分求和即可,在同分的時候注意不能一次同分完,可能會爆long long,所以每讀一個數同分一次,注意分子加上以後注意看能不能約分,能約分的話先約分,最後答案也要注意約分,這也是坑點之一
下面給出程式碼
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 using namespace std; 7 typedef long long ll; 8 9 ll gcd(ll a,ll b) //最大公因數 10 { 11return b==0?a:gcd(b,a%b); 12 } 13 int main() 14 { 15int n; 16ll m=1,z=0,fz,fm;//fz分子fm分母 17cin>>n; 18scanf("%lld/%lld",&z,&m);//讀第一個數 19int tmp=gcd(z,m); 20if(z){//如果當前可約分先約分 21z/=tmp;m/=tmp; 22} 23for(int i=2;i<=n;i++) //從第二個數開始向後讀 24{ 25scanf("%lld/%lld",&fz,&fm); 26int lcp=m/gcd(m,fm)*fm; 27z=z*lcp/m+fz*lcp/fm; 28m=lcp; 29int t=gcd(z,m); 30if(t!=0) 31{ 32z=z/t; m=m/t; 33} 34} 35if(z&&z/m==0) 36cout<<z%m<<"/"<<m; 37else if(z%m==0) cout<<z/m; 38else cout<<z/m<<" "<<z%m<<"/"<<m; 39return 0; 40 }
<strong> </strong>