有理数四则运算——PAT乙级
注意
负数前面要加括号
#include<bits/stdc++.h>
using namespace std;
struct Fraction{
int up, down;
};
int gcd(int a, int b){
return b==0? a: gcd(b, a%b);
}
Fraction reduction(Fraction a){
if(a.up == 0){
a.down = 1;
}else if(a.down < 0){
a.up = -a.up;
a.down = -a.down;
}else{
int d= gcd(abs(a.up), a.down);
a.up = a.up/d;
a.down = a.down/d;
}
return a;
}
void show(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,a.down);
if(a.up<0) printf(")");
}
Fraction add(Fraction a, Fraction b){
Fraction res;
res.up = a.up*b.down + b.up*a.down;
res.down = a.down * b.down;
return reduction(res);
}
Fraction sub(Fraction a, Fraction b){
Fraction res;
res.up = a.up*b.down - b.up*a.down;
res.down = a.down * b.down;
return reduction(res);
}
Fraction mul(Fraction a, Fraction b){
Fraction res;
res.up = a.up * b.up;
res.down = a.down * b.down;
return reduction(res);
}
Fraction div(Fraction a, Fraction b){
Fraction res;
res.up = a.up * b.down;
res.down = a.down * b.up;
return reduction(res);
}
int main(){
int a,b;
Fraction f1,f2,ans;
scanf("%d/%d",&a,&b);
f1.up = a;
f1.down = b;
scanf("%d/%d",&a,&b);
f2.up = a;
f2.down = b;
//加
show(f1);
printf(" + ");
show(f2);
printf(" = ");
show(add(f1,f2));
printf("\n");
//减
show(f1);
printf(" - ");
show(f2);
printf(" = ");
show(sub(f1,f2));
printf("\n");
//乘
show(f1);
printf(" * ");
show(f2);
printf(" = ");
show(mul(f1,f2));
printf("\n");
//除
show(f1);
printf(" / ");
show(f2);
printf(" = ");
if(f2.up == 0) printf("Inf\n");
else {
show(div(f1,f2));
printf("\n");
}
return 0;
}
查看11道真题和解析
