N個數求和(PTA)


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM