L1-009. N個數求和


本題的要求很簡單,就是求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
很簡單的一道題,調試了好久。唉,重要的是這幾組測試用例:
3
0/1 0/2 0/3

1
2/10

3
0/1 0/2 5/10

再加上他給的三組測試用例。
這題是有漏洞的。下面的代碼的第26行,如果數字很大的話,有可能會越界。但是他仍然給通過了。還有一點就是,輸入時分母為0,這種情況,下面代碼沒有考慮,但也給通過了。
 1 #include <stdio.h>
 2 
 3 long long gcd(long long a,long long b){
 4   if(a == 0)
 5     return 0;
 6   else
 7     return (b == 0) ? a : gcd(b, a % b);
 8 }
 9 
10 int main(){
11   int N;
12   long long lcp;
13   long long a,b,c,d;
14   int i = 1;
15   scanf("%d",&N);
16   scanf("%lld/%lld",&a,&b);
17   int t0 = gcd(a,b);
18   if(a){
19         a /= t0;
20         b /= t0;
21   }
22 
23   while(i < N){
24     scanf("%lld/%lld",&c,&d);
25     lcp = b / gcd(b,d) * d;
26     a = a * lcp / b + c * lcp / d;
27     b = lcp;
28     int t0 = gcd(a,b);
29     if(t0 != 0){
30             a = a / t0;
31             b = b / t0;
32     }
33     i++;
34   }
35   if(a && a/b == 0)/// 整數部分為0 且 a不為 0
36     printf("%lld/%lld\n",a%b,b);
37   else if(a%b == 0)/// 小數部分為0
38     printf("%lld\n",a/b);
39   else
40     printf("%lld %lld/%lld\n",a/b,a%b,b);
41   return 0;
42 }

 


免責聲明!

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



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