1088 Rational Arithmetic (20分)

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
LL gcd(LL a, LL b)
{
	if(b!=0) return gcd(b,a%b);
	else return a;
} 
struct fraction{
	LL numer; 
	LL denom;
};

fraction simp(fraction a)
{
	LL common = gcd(abs(a.numer),a.denom);
	a.numer/=common;
	a.denom/=common;
	return a;
}

fraction add(fraction a,fraction b)
{
	a = simp(a); 
	b = simp(b);
	fraction ans;
	ans.denom = a.denom*b.denom;
	ans.numer = a.numer*b.denom+b.numer*a.denom;
	ans = simp(ans);
	return ans;
}
fraction Minus(fraction a,fraction b)
{
	b.numer = -b.numer;
	return add(a,b);
}
fraction multi(fraction a,fraction b)
{
	a = simp(a);
	b = simp(b);
	fraction ans;
	ans.numer = a.numer*b.numer;
	ans.denom = a.denom*b.denom;
	ans = simp(ans);
	return ans;
}
fraction chu(fraction a, fraction b)
{
	a=simp(a);
	b=simp(b);
	if(b.numer<0){
		 b.numer=-b.numer;
		 b.denom = -b.denom;
	}
	fraction c;
	c.numer = a.numer*b.denom;
	c.denom = a.denom*b.numer;
	c=simp(c);
	return c;
}
void show(fraction a)
{
	a=simp(a);//这句话可别忘记了 
	if(a.numer==0){
		printf("0");
		return;
	}
	bool flag=false;
	if(a.numer<0){
		flag = true;
		printf("(-");
		a.numer=-a.numer;
	}
	if(a.numer>=a.denom){
		printf("%lld",a.numer/a.denom);
		if(a.numer%a.denom!=0){
			printf(" %lld/%lld",a.numer%a.denom,
			a.denom);
		}
	}
	else{
		printf("%lld/%lld",a.numer,
			a.denom);
	}
	if(flag) printf(")");
}

int main()
{
	fraction a,b;
	scanf("%lld/%lld %lld/%lld",&a.numer,&a.denom,
	&b.numer,&b.denom);
	fraction addAns = add(a,b);
	show(a);
	printf(" + ");
	show(b);
	printf(" = ");
	show(addAns);
	printf("\n");
	fraction minusAns = Minus(a,b);
	show(a);
	printf(" - ");
	show(b);
	printf(" = ");
	show(minusAns);
	printf("\n");
	fraction c = multi(a,b);
	show(a);
	printf(" * ");
	show(b);
	printf(" = ");
	show(c);
	printf("\n");
	show(a);
	printf(" / ");
	show(b);
	printf(" = ");
	if(b.numer==0) printf("Inf");
	else show(chu(a,b));
	printf("\n");
	return 0;
}










 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值