1088. Rational Arithmetic (20)

本文介绍了一种分数运算的实现方法,包括加、减、乘、除等基本运算,并通过求最大公约数实现了分数的简化。文章提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

分数运算

首先分数有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值