分数运算
首先分数有3点要素:
1.分母要大于0
2.分书为0时,分子为0,分母为1
3.要约分,即求最小公倍数gcd(a,b)但是a和b要取绝对值
分数输出时要将假分数化为真分数
时刻记着化简分数
#include <cstdio>
long long abss(long long a){
return a<0?-a:a;
}
long long gcd(long long a,long long b){
if(b==0){
return a;
}else{
return gcd(b,a%b);
}
}
struct fraction{
long long up,down;
};
fraction reduction(fraction f){
if(f.down<0){
f.down=-f.down;
f.up=-f.up;
}
if(f.down==0){
f.up=0;
f.down=1;
}else{
//注意取绝对值
long long tmp=gcd(abss(f.down),abss(f.up));
f.down/=tmp;
f.up/=tmp;
}
return f;
}
void show(fraction a){
int flag=1;
a=reduction(a);
if(a.up<0){
printf("(-");
a.up=-a.up;
flag=0;
}
if(a.down==1){
printf("%lld",a.up);
if(flag==0){
printf(")");
}
return;
}else if(a.up>a.down){
long long k=a.up/a.down;
a.up%=a.down;
printf("%lld ",k);
}
printf("%lld/%lld",a.up,a.down);
if(flag==0){
printf(")");
}
}
void myprint(fraction a,fraction b,fraction c,char fu){
show(a);
printf(" %c ",fu);
show(b);
printf(" = ");
if(b.up==0 && fu=='/'){
printf("Inf");
}else{
show(c);
}
printf("\n");
}
void add(fraction a,fraction b){
a=reduction(a);
b=reduction(b);
fraction c;
c.up=a.up*b.down+a.down*b.up;
c.down=a.down*b.down;
c=reduction(c);
myprint(a,b,c,'+');
}
void sub(fraction a,fraction b){
a=reduction(a);
b=reduction(b);
fraction c;
c.up=a.up*b.down-a.down*b.up;
c.down=a.down*b.down;
c=reduction(c);
myprint(a,b,c,'-');
}
void mul(fraction a,fraction b){
a=reduction(a);
b=reduction(b);
fraction c;
c.up=a.up*b.up;
c.down=a.down*b.down;
c=reduction(c);
myprint(a,b,c,'*');
}
void divv(fraction a,fraction b){
a=reduction(a);
b=reduction(b);
fraction c;
c.up=a.up*b.down;
c.down=a.down*b.up;
c=reduction(c);
myprint(a,b,c,'/');
}
int main(){
freopen("in.txt","r",stdin);
fraction a,b;
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
add(a,b);
sub(a,b);
mul(a,b);
divv(a,b);
return 0;
}