GCD LCM 最大公约数 最小公倍数 分数模板 (防溢出优化完成)
自己写的一个分数模板,在运算操作时进行了防溢出的优化:
ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
}
ll lcm(ll a, ll b) {
return a / gcd(a,b) * b;
}
struct divi {
ll a = ,b = ;
};
divi simdiv(divi a) {
ll i;
divi divn = a;
ll k = gcd(a.a,a.b);
divn.a /= k;
divn.b /= k;
if(divn.b < ) {
divn.a = -divn.a;
divn.b = -divn.b;
}
return divn;
}
divi plusdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
dn.b = lcm(a.b,b.b);
dn.a = a.a*(dn.b/a.b)+b.a*(dn.b/b.b);
return simdiv(dn);
}
divi minusdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
dn.b = lcm(a.b,b.b);
dn.a = a.a*(dn.b/a.b)-b.a*(dn.b/b.b);
return simdiv(dn);
}
divi muldiv(divi i, divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
ll chu1 = gcd(a.a,b.b);
ll chu2 = gcd(a.b,b.a);
dn.b = (a.b/chu2) * (b.b/chu1);
dn.a = (a.a/chu1) * (b.a/chu2);
return simdiv(dn);
}
divi divdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
ll chu1 = gcd(a.a,b.a);
ll chu2 = gcd(a.b,b.b);
dn.b = (a.b / chu2) * (b.a / chu1);
dn.a = (a.a / chu1) * (b.b / chu2);
return simdiv(dn);
}
int cmpdiv(divi i,divi j) { //a>b返回1, a=b返回0, a<b返回-1, 无法比较返回INF
divi a = simdiv(i);
divi b = simdiv(j);
if(a.b == || b.b == ) {
if(a.b == && b.b == ) return INF;
else {
if(a.b == ) {
if(a.a > ) return ;
if(a.a < ) return -;
if(a.a == ) return INF;
} else {
if(b.b == ) {
if(b.a > ) return -;
if(b.a < ) return ;
if(b.a == ) return INF;
}
}
}
} else {
ll di = lcm(a.b,b.b);
ll a1 = a.a * (di / a.b);
ll a2 = b.a * (di / b.b);
if(a1 > a2) return ;
if(a1 == a2) return ;
if(a1 < a2) return -;
}
}
double valueofdiv(divi a) {
if(a.a == ) return ;
if(a.b == ) {
if(a.a >= ) return (double)INF;
if(a.a < ) return -(double)INF;
}
return (double)a.a/(double)a.b;
}
测试代码:
divi a,b;
while(==) {
scanf("%lld%lld",&a.a,&a.b);
scanf("%lld%lld",&b.a,&b.b);
printf("+: %lld/%lld\n",plusdiv(a,b).a,plusdiv(a,b).b);
printf("-: %lld/%lld\n",minusdiv(a,b).a,minusdiv(a,b).b);
printf("*: %lld/%lld\n",muldiv(a,b).a,muldiv(a,b).b);
printf("/: %lld/%lld\n",divdiv(a,b).a,divdiv(a,b).b);
printf("cmp: %d\n",cmpdiv(a,b));
printf("value: %lf %lf\n",valueofdiv(a),valueofdiv(b));
}
GCD LCM 最大公约数 最小公倍数 分数模板 (防溢出优化完成)的更多相关文章
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 数论3——gcd&&lcm
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- Mathematics:GCD & LCM Inverse(POJ 2429)
根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...
- POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)
[题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...
- hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...
- 最大公约数&&最小公倍数
//最大公约数(greatest common divisor),运用递归 int gcd(int a,int b){//注意a要求大于b return !b?a:gcd(b,a%b); } //最小 ...
- O(n log log n)实现FGT和FLT(Fast GCD/LCM Transformation)
本文是作者看不懂分治FFT之后开始娱乐一下自己写的 看到一道题时候询问了正解后,推出了一个奇怪的变换,发现这个很Transformation,我和正解推出来的奇怪的东西是一样的,但还是想写一下思路.. ...
- C - GCD LCM
Description The GCD of two positive integers is the largest integer that divides both the integers w ...
- 7-6 jmu_python_最大公约数&最小公倍数 (10 分)
本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数 提示:求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式: 在一行中输入两个整数,以逗号间隔 ...
随机推荐
- tomcate8配置多个二级域名问题解决根目录空白2017年12月9日
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...
- Extjs treePanel 的treestore重复加载问题解决
在Extjs 4.2.2 中构建一个treePanel 发现设置rootVisible后 ,treeStore中设置的autoLoad:false不启作用,在组件初始化的时候即加载数据源,造成数据重复 ...
- java的异常分类
结构关系 throwable error exception checked异常 runtime异常 checked异常也叫io异常这种异常一般我们会在程序块加入trycatch处理它. runt ...
- 学习WebSocket笔记
由于HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接. 当用户在浏览器上进行操作时,可以请求服务器上的api:但是反过来不可以:服务端发生了一件事,无法将这个事 ...
- Spring知识点总结(五)Spring整合JDBC
1. 回顾JDBC a. java操作关系型数据的API.导入相关数据库的驱动包后可以通过JDBC提供的接口来操作数据库. b. 实现JDBC的六个步骤 ...
- java交换两个值的三种方法 经典
1.中间变量(在开发中常用) int c=a; a=b; b=c; System.out.println("a的值: "+a+" b的值: "+b); 2.按位 ...
- python tips(持续更新中)
python tips 可变对象与不可变对象 在python中,可变对象有数值类型(int,float),字符串(str),元组(tuple),可变对象有列表(list),字典(dict),集合(se ...
- 转载:Python中的if __name__ == '__main__'
刚开始学习Python时,对于有些书出现的函数带有“if __name__ == '__main__'”总是迷惑不解,比如<dive into Python>中开头的哪个根据输入的数字计算 ...
- window.location.href url含中文乱码问题
(1).页面中先对中文进行编码. 如:window.location.href = url+"&groupName=" + encodeURI(encodeURI(grou ...
- 通过Ops Manager安装管理mongodb-3.4集群
node1 Ops Manager,mongodb,agent node2 mongodb,agent node3 mongodb,agent 参考文档 https://docs.opsmanager ...