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:
2
輸入樣例3:
3
1/3 -1/6 1/8
輸出樣例3:
7/24
思路:
每兩個相加,分母通分,分子按比例相加,每次運算完成之后化成最簡分數。 僅有整數部分輸出整數,整數部分為0只輸出分數部分(0特殊,輸出0),否則整數、分數分開(分數部分都為正數) 這題自己也整了很久,卡17,后來去找了一下題解跑一下發現都有同樣的問題(-3/2的時候他們的結果都是-1 1/-2,個人覺得這樣是過不了的)
真的自閉,在認為自己思路正確的情況下修改為如下代碼:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #define ll long long 5 using namespace std; 6 7 ll gcd(ll a,ll b) 8 { 9 return a%b==0?b:gcd(b,a%b); 10 } 11 12 void solve(ll &a,ll &b) 13 { 14 ll yue=gcd(a,b); 15 if(yue){ 16 a/=yue; 17 b/=yue; 18 } 19 } 20 21 int main() 22 { 23 int n; 24 ll x,y,fz=0,fm=1; 25 scanf("%d",&n); 26 for(int i=0;i<n;i++){ 27 scanf("%lld/%lld",&x,&y); 28 ll yue=gcd(fm,y),bei=fm/yue*y; 29 fz=fz*(bei/fm)+x*(bei/y); 30 fm=bei; 31 solve(fz,fm); 32 } 33 //僅為0時輸出整數部分0 34 if(fz==0){ 35 printf("0\n"); 36 } 37 else if(abs(fz)<abs(fm)){ 38 if(fz*fm<0) printf("-"); 39 printf("%lld/%lld\n",abs(fz),abs(fm)); 40 } 41 else{ 42 printf("%lld",fz/fm); 43 if(fz%fm){ 44 printf(" %lld/%lld",abs(fz%fm),abs(fm)); 45 } 46 printf("\n"); 47 } 48 return 0; 49 }