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 分)
本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数 提示:求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式: 在一行中输入两个整数,以逗号间隔 ...
随机推荐
- Win7安装MinGW
MinGW官网:http://www.mingw.org/ 点击下载,稍后就会跳转到下载页面 下载文件后是一个在线安装包,下载过程有点长 Basic Setup里的包都需要安装,点击Installat ...
- o'Reill的SVG精髓(第二版)学习笔记——第九章
第九章:文本 9.1 字符:在XML文档中,字符是指带有一个数字值的一个或多个字节,数字只与Unicode标准对应. 符号:符号(glyph)是指字符的视觉呈现.每个字符都可以用很多不同的符号来呈现. ...
- Swift 中关于”??”操作符
Swift 中关于”??”操作符 Swift 的语法在保证安全和健壮的基础上,又带有很多非常灵活的特性,比如 ?? 操作符就是其中一个.大家可能已经了解它,也可能有些同学不了解它,这里给大家整理了关于 ...
- 如何在Vue中使用Mockjs模拟数据的增删查改
之前一直使用json-server在前端开发时,搭建本地数据接口测试,但有时又需要将做好的项目放于 github page上做项目演示.在本地时,json server很好使用,但一旦放在github ...
- MVVM、MVC框架的认识
推荐博客: https://blog.csdn.net/jia12216/article/details/55520426 https://www.cnblogs.com/sunny_z/p/7093 ...
- springboot properties文件中的数据通过@Value()形式注入
首先在resources目录下新建一个properties文件,如下图 在photoPath.properties中写入内容,key=value的形式,如下图 在你需要引用properties的类头部 ...
- JAVAOOP多线程
进程每个独立运行的任务对应一个进程,每个进程可以产生多个线程 特点:1,进程是系统运行程序的基本单位 2,每一个进程都有自己独立的一块内存空间,一组系统资源 3,每一个进程的内部数据和状态都是完全独立 ...
- 使用CSS3制作首页登录界面实例
响应式设计 在这个页面中,使用下面3点来完成响应式设计 1.最大宽度 .设定了一个 max-width 的最大宽度,以便在大屏幕时兼容.: 2.margin : 30px auto; 使其保持时刻居中 ...
- 【Thrift一】Thrift安装部署
Thrift安装部署 Thrift安装部署 下载源码包 安装g++ 解压Thrift安装包 安装boost开发工具 测试(python版) 下载源码包 wget http://apache.fayea ...
- python 中 pynlpir错误 Cannot Open Configure file pynlpir\Data\Configure.xml 解决
在用python做分词.数据处理的时候,想调用pynlpir库,pynlpir.open()时出现错误,更新一下授权文件还是错误, 仔细一看错误是:Cannot Open Configure file ...