1. 程式人生 > >PAT L1-009. N個數求和 分數求和 struct過載

PAT L1-009. N個數求和 分數求和 struct過載

L1-009. N個數求和

時間限制
400 ms
記憶體限制
65536 kB
程式碼長度限制
8000 B

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

題解:

一直不知道分數要怎麼計算求和,看了zyyyyy的程式碼才知道原來用struct過載+運算用起
來如此科學,真是學習了!然後發現一個萬能標頭檔案#include <bits/stdc++.h>,
以後寫程式碼方便了不少。不說了,直接上程式碼
#include <bits/stdc++.h>
#define INF 0xffffffff
using
namespace std; typedef long long ll; ll gcd(ll a, ll b){ return b == 0 ? a:gcd(b, a%b); } struct Frac{ ll up, dw; Frac(){} Frac(ll x):up(x), dw(1){} Frac(ll x, ll y){ if(x == 0){ up = 0; dw = 1; } else{ up = x; dw = y; ll g = gcd(up, dw); up /= g; dw /= g; } } Frac operator
+ (const Frac &b) const{ return Frac(dw*b.up+up*b.dw, dw*b.dw); } void print(){ if(up == 0){ printf("0\n"); return; } int zero = 0; if(up/dw){ printf("%lld", up/dw); up %= dw; zero = 1; } if(up){ if(zero){ printf(" "); } printf("%lld/%lld", up, dw); } printf("\n"); } }; int main(){ int n; while(scanf("%d", &n) == 1 && n){ Frac ans(0); for(int i=0; i<n; i++){ ll x, y; scanf("%lld/%lld", &x, &y); ans = ans + Frac(x, y); } ans.print(); } return 0; }