本題的要求很簡單,就是求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 }
