patA1088 Rational Arithmetic

3 篇文章 0 订阅
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;


struct fraction{
ll up,down;
};


ll gcd(ll a,ll b){
return b==0 ? a : gcd(b,a%b);
}
fraction reduction(fraction x){
if(x.up == 0){
x.down = 1;
}else if(x.down < 0){                 //!******
x.up=-x.up;
x.down=-x.down;
}else{
int d=gcd(fabs(x.up),fabs(x.down));
x.up/=d;
x.down/=d;
}
return x;
}


void print(fraction a){
a=reduction(a);  
if(a.up < 0) printf("(");            //*****
if(a.down==1){
printf("%lld",a.up);
}else if(abs(a.up) > a.down){
// a.up=abs(a.up);
printf("%lld %lld/%lld",a.up/a.down,abs(a.up) % a.down,a.down);
}else{
printf("%lld/%lld",a.up,a.down);

if(a.up < 0) printf(")");
}


fraction sum(fraction a,fraction b){
fraction c;
print(a);
printf(" + ");
// printf("%ld/%ld\n",b.up,b.down);
print(b);
printf(" = ");
c.up=a.up*b.down+a.down*b.up;
c.down=a.down*b.down;
    c=reduction(c);                          //传入的局部变量需要改变。 
print(c);
}
fraction div(fraction a,fraction b){
fraction c;
print(a);
printf(" / ");
print(b);
printf(" = ");
if(a.up !=0 && b.up !=0){
c.up=a.up*b.down;
c.down=a.down*b.up;
c=reduction(c);
print(c);
}else{
printf("Inf");
}

}
fraction mul(fraction a,fraction b){
fraction c;
print(a);
printf(" * ");
print(b);
printf(" = ");
c.up=a.up*b.up;
c.down=a.down*b.down;
c=reduction(c);
print(c);
}
fraction sub(fraction a,fraction b){
fraction c;
print(a);
printf(" - ");
print(b);
printf(" = ");
c.up=a.up*b.down-b.up*a.down;
c.down=a.down*b.down;
c=reduction(c);
print(c);
}


int main(int argc, char** argv) {
fraction x1,x2;
scanf("%lld/%lld %lld/%lld",&x1.up,&x1.down,&x2.up,&x2.down);  //!最后的结果没有化简。 
// printf("%ld %ld\n",x2.up,x2.down);
sum(x1,x2); putchar('\n');
sub(x1,x2); putchar('\n');
mul(x1,x2); putchar('\n');
div(x1,x2);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值