PAT A1088 Rational Arithmetic
Sample Input 1:
2/3 -4/2
Sample Output 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
Sample Input 2:
5/3 0/6
Sample Output 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
-
思路 1:
模拟分数的四则运算 -
TIPS 1:要注意乘法的过程中可能会溢出 -> 要使用long long 存储分子分母
-
code 1:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
struct Fraction{
ll up, down;
};
ll gcd(ll a, ll b){
return !b ? a : gcd(b, a % b);
}
Fraction reduction(Fraction a){
if(a.down < 0){
a.up = -a.up;
a.down = -a.down;
}
if(a.up == 0){
a.down = 1;
}else{
int d = gcd(abs(a.up), abs(a.down));
a.up /= d;
a.down /= d;
}
return a;
}
Fraction add(Fraction a, Fraction b){
Fraction result;
result.up = a.up * b.down + a.down * b.up;
result.down = a.down * b.down;
return reduction(result);
}
Fraction sub(Fraction a, Fraction b){
Fraction result;
result.up = a.up * b.down - a.down * b.up;
result.down = a.down * b.down;
return reduction(result);
}
Fraction multi(Fraction a, Fraction b){
Fraction result;
result.up = a.up * b.up;
result.down = a.down * b.down;
return reduction(result);
}
Fraction div(Fraction a, Fraction b){
Fraction result;
result.up = a.up * b.down;
result.down = a.down * b.up;
return reduction(result);
}
void output(Fraction a){
a = reduction(a);
if(a.up < 0) printf("(");
if(a.down == 1){ //整数
printf("%d", a.up);
}else if(abs(a.up) > a.down){ //假分数
printf("%d %d/%d", a.up/a.down, abs(a.up) % a.down, a.down);
}else //分数
printf("%d/%d", a.up, a.down);
if(a.up < 0) printf(")");
}
int main(){
int aup, adown, bup, bdown;
scanf("%d/%d %d/%d", &aup, &adown, &bup, &bdown);
Fraction a, b;
a.up = aup; a.down = adown;
b.up = bup; b.down = bdown;
output(a); printf(" + "); output(b); printf(" = "); output(add(a, b)); printf("\n");
output(a); printf(" - "); output(b); printf(" = "); output(sub(a, b)); printf("\n");
output(a); printf(" * "); output(b); printf(" = "); output(multi(a, b)); printf("\n");
output(a); printf(" / "); output(b); printf(" = ");
if(b.up == 0) printf("Inf");
else output(div(a, b));
printf("\n");
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Frac
{
ll up, down;
}fa, fb;
ll gcd(ll a, ll b)
{
return b != 0 ? gcd(b, a % b) : a;
}
Frac Reduce(Frac f)
{
if(f.down < 0)
{
f.up = -f.up;
f.down = -f.down;
}
if(f.up == 0)
{
f.down = 1;
}else
{
int d = gcd(abs(f.up), f.down);
f.up /= d; f.down /= d;
}
return f;
}
Frac ADD(Frac a, Frac b)
{
Frac ans;
ans.up = a.up * b.down + b.up * a.down;
ans.down = a.down * b.down;
return Reduce(ans);
}
Frac Minus(Frac a, Frac b)
{
Frac ans;
ans.up = a.up * b.down - b.up * a.down;
ans.down = a.down * b.down;
return Reduce(ans);
}
Frac Product(Frac a, Frac b)
{
Frac ans;
ans.up = a.up * b.up;
ans.down = a.down * b.down;
return Reduce(ans);
}
Frac Div(Frac a, Frac b)
{
Frac ans;
ans.up = a.up * b.down;
ans.down = a.down * b.up;
return Reduce(ans);
}
void ShowAns(Frac ans)
{
if(ans.up < 0) printf("(");
if(ans.down == 0)
{
printf("Inf");
}else if(abs(ans.down) == 1)
{
printf("%lld", ans.down < 0 ? -ans.up : ans.up);
}else if(abs(ans.up) > ans.down)
{
printf("%lld %lld/%lld", ans.up / ans.down, abs(ans.up) % ans.down, ans.down);
}else
{
printf("%lld/%lld", ans.up, ans.down);
}
if(ans.up < 0) printf(")");
}
int main()
{
scanf("%lld/%lld %lld/%lld", &fa.up, &fa.down, &fb.up, &fb.down);
fa = Reduce(fa); fb = Reduce(fb);
ShowAns(fa); printf(" + "); ShowAns(fb); printf(" = "); ShowAns(ADD(fa, fb)); printf("\n");
ShowAns(fa); printf(" - "); ShowAns(fb); printf(" = "); ShowAns(Minus(fa, fb)); printf("\n");
ShowAns(fa); printf(" * "); ShowAns(fb); printf(" = "); ShowAns(Product(fa, fb)); printf("\n");
ShowAns(fa); printf(" / "); ShowAns(fb); printf(" = "); ShowAns(Div(fa, fb)); printf("\n");
return 0;
}