1088 Rational Arithmetic

本题需要具备有理数处理相关知识。

本次收获(错点)

(1)在化简求最大公约数时,忘记给传入的分子加绝对值

(2)把除法错写成乘法,自己设计测试用例才测出orz

AC代码

#include<cstdio>
#include<iostream>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<queue>
#include<string>

using namespace std;

const int maxn = 1001;

typedef long long ll;

struct Frac{
	ll up,down;
};

ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}

Frac reduct(Frac bn){
	if(bn.down<0){
		bn.up = -bn.up;
		bn.down = -bn.down;
	}
	if(bn.up==0)bn.down = 1;
//	else{
		ll shared = gcd(abs(bn.up),bn.down);
		bn.up /= shared;
		bn.down /= shared;
//	}
	
	return bn;
}

void print(Frac bn){
	bn = reduct(bn);
	if(bn.up<0)printf("(");
	if(bn.down==1){
		 printf("%lld",bn.up);
	}else if(abs(bn.up)>bn.down){
		printf("%lld %lld/%lld",bn.up/bn.down,abs(bn.up)%bn.down,bn.down);
	}else{
		printf("%lld/%lld",bn.up,bn.down);
	}
	if(bn.up<0)printf(")"); 
}

Frac addBign(Frac a,Frac b){
	Frac c;
	c.up = a.up*b.down + b.up*a.down;
	c.down = a.down*b.down;
	return reduct(c);
}

Frac subBign(Frac a,Frac b){
	Frac c;
	c.up = a.up*b.down - b.up*a.down;
	c.down = a.down*b.down;
	return reduct(c);
}

Frac multiBign(Frac a,Frac b){
	Frac c;
	c.up = a.up*b.up;
	c.down = a.down*b.down;
	return reduct(c);
}

Frac diviBign(Frac a,Frac b){
	Frac c;
	c.up = a.up*b.down;
	c.down = a.down*b.up;
	return reduct(c);
}

int main(){
	
	Frac a,b;
	scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
	
	print(reduct(a));
	printf(" + ");
	print(reduct(b));
	printf(" = ");
	print(addBign(a,b));
	printf("\n");
	
	print(reduct(a));
	printf(" - ");
	print(reduct(b));
	printf(" = ");
	print(subBign(a,b));
	printf("\n"); 
	
	print(reduct(a));
	printf(" * ");
	print(reduct(b));
	printf(" = ");
	print(multiBign(a,b));
	printf("\n");
	
	print(reduct(a));
	printf(" / ");
	print(reduct(b));
	printf(" = ");
	if(b.up!=0)print(diviBign(a,b));
	else printf("Inf");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSU迦叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值