PAT A1081 Rational Sum
Sample Input 1:
5
2/5 4/15 1/30 -2/60 8/3
Sample Output 1:
3 1/3
Sample Input 2:
2
4/3 2/3
Sample Output 2:
2
Sample Input 3:
3
1/3 -1/6 1/8
Sample Output 3:
7/24
word | meaning |
---|---|
numerator | n. 分子 |
denominator | n. [数] 分母 |
fractional | [数] 分数的 |
-
思路 1:
模拟分数加法,约分,以及规格化输出 -
code 1:
#include <stdio.h>
#include <cmath>
#include <iostream>
#define ll long long
using namespace std;
struct Frac{
ll up, down;
}frac[110];
ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a%b);
}
Frac simp(Frac a){
int up = a.up;
if(a.up < 0) up = -a.up;
if(a.up == 0) a.down = 1; //!!!Wrong 1:
else{
ll d = gcd(up, a.down);
a.up /= d;
a.down /= d;
}
return a;
}
Frac mul(Frac a, Frac b){
Frac res;
simp(a); simp(b);
res.down = a.down * b.down;
res.up = a.up * b.down + b.up * a.down;
res = simp(res);
return res;
}
void output(Frac a){
simp(a);
if(a.down == 1) printf("%lld", a.up); //整数
else if(abs(a.up) > a.down) //假分数
printf("%lld %lld/%lld", abs(a.up)/a.down, a.up%a.down, a.down);
else printf("%lld/%lld", a.up, a.down); //分数
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%lld/%lld", &frac[i].up, &frac[i].down);
}
Frac ans; ans.up = 0; ans.down = 1;
for(int i = 0; i < n; ++i){
ans = mul(ans, frac[i]);
}
output(simp(ans));
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
struct Frac{
int up, down;
Frac(){
up = 0;
down = 1;
}
};
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
Frac Reduction(Frac r){
if(r.down < 0){
r.down = -r.down;
r.up = -r.up;
}
if(r.up == 0){
r.down = 1;
}else{
int d = gcd(abs(r.up), r.down);
r.up /= d;
r.down /= d;
}
return r;
}
Frac Add(Frac a, Frac b){
a.up = a.up * b.down + b.up * a.down;
a.down = a.down * b.down;
return a;
}
void Print(Frac r){
r = Reduction(r);
if(r.down == 1){ //整数
printf("%d", r.up);
}else if(r.up > r.down){
printf("%d %d/%d", r.up / r.down , abs(r.up) % r.down, r.down);
}else{
printf("%d/%d", r.up, r.down);
}
}
int main(){
int n;
scanf("%d", &n);
Frac ans;
for(int i = 0; i < n; ++i){
Frac tmp;
scanf("%d/%d", &tmp.up, &tmp.down);
ans = Add(ans, tmp);
}
Print(ans);
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
struct Frac
{
int up, down;
}frac[maxn];
int Gcd(int a, int b)
{
return (b == 0 ? a : Gcd(b, a % b));
}
Frac Reduce(Frac f)
{
if(f.up < 0)
{
f.up = -f.up;
f.down = -f.down;
}
if(f.up == 0)
{
f.down = 1;
}else
{
int d = Gcd(f.up, abs(f.down));
f.up /= d;
f.down /= d;
}
return f;
}
void ADD(Frac & ans, Frac fb)
{
ans.up = ans.up * fb.down + fb.up * ans.down;
ans.down = ans.down * fb.down;
ans = Reduce(ans);
}
void ShowFrac(Frac ans)
{
if(abs(ans.down) == 1)
{
printf("%d", ans.down < 0 ? -1 * ans.up : ans.up);
}else if(ans.up > abs(ans.down))
{
printf("%d %d/%d", ans.up / abs(ans.down), ans.up % abs(ans.down), ans.down);
}else
{
printf("%d/%d", ans.up, ans.down);
}
}
int main()
{
Frac ans; ans.up = 0; ans.down = 1;
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
Frac tmp;
scanf("%d/%d", &tmp.up, &tmp.down);
ADD(ans, tmp);
}
ShowFrac(ans);
return 0;
}