实用技巧——分数运算

分数运算模拟

 以NOIP2020第一题排水系统一题为例子。

思路

 如何模拟分数运算,我们先来看看小学的时候我们是怎么算分数的。
a b + c d = a d + b c b d \frac{a}{b}+\frac{c}{d}=\frac{ad+bc}{bd} ba+dc=bdad+bc
 就是这样的通分运算。如果可能的话最后的结果还要化为互质。

 这不就思路吗:我们只需要模拟通分和约分过程就可以了。

代码

#define ll long long
inline void add(int u,ll x,ll y){//x是被加数的分子,y是被加数的分母 
	if(y==0)return;//y为0无意义 
	if(yy[u]==0){xx[u]=x;yy[u]=y;return;}//加数为0 
	ll p1=xx[u]*y+yy[u]*x;
	ll p2=yy[u]*y;//通分 
	ll p3=gcd(p1,p2);
	xx[u]=p1/p3;
	yy[u]=p2/p3;//约分 
	return;
}

ll gcd(ll x,ll y){
	if(y==0) return x;
	return gcd(y,x%y);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值