自己写的一个分数模板,在运算操作时进行了防溢出的优化:

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 最大公约数 最小公倍数 分数模板 (防溢出优化完成)的更多相关文章

  1. 数论入门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 ...

  2. 数论3——gcd&&lcm

    gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •̀∀•́ ) ...

  3. Mathematics:GCD & LCM Inverse(POJ 2429)

    根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...

  4. POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)

    [题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...

  5. hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...

  6. 最大公约数&&最小公倍数

    //最大公约数(greatest common divisor),运用递归 int gcd(int a,int b){//注意a要求大于b return !b?a:gcd(b,a%b); } //最小 ...

  7. O(n log log n)实现FGT和FLT(Fast GCD/LCM Transformation)

    本文是作者看不懂分治FFT之后开始娱乐一下自己写的 看到一道题时候询问了正解后,推出了一个奇怪的变换,发现这个很Transformation,我和正解推出来的奇怪的东西是一样的,但还是想写一下思路.. ...

  8. C - GCD LCM

    Description The GCD of two positive integers is the largest integer that divides both the integers w ...

  9. 7-6 jmu_python_最大公约数&最小公倍数 (10 分)

    本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数 提示:求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式: 在一行中输入两个整数,以逗号间隔 ...

随机推荐

  1. UGUI富文本

    <b>text</b>  --粗体 <i>text<i>     --斜体 <size=10>text</size>   --自 ...

  2. JS JavaScript中的文档碎片 DocumentFragement JS性能优化

    文档碎片是什么: 如果我们要在一个ul中添加100个li,如果不使用文档碎片,那么我们就需要使用append经常100次的追加,这会导致浏览器一直不停的渲染,是非常消耗资源的.但是如果我们使用文档碎片 ...

  3. 使用dva框架的总结

    最近的项目是react+dva+atd+webpack的一个后台项目,刚接触dva就感觉很喜欢,很简洁用着很爽. 关于使用redux中的一些问题 1.文件切换问题. redux的项目通常哟啊分为red ...

  4. java中静态代理和动态代理

    一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能 ...

  5. linux下mysql主从复制,实现数据库同步

    运行环境: 查看linux版本命令:lsb_release -a 主服务器:centos release 6.5 mysql 5.6.10-log  IP:172.17.200.25从服务器:cent ...

  6. django 面试题

    面试题1:migrate怎么判断哪些迁移脚本需要执行: 他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移 ...

  7. 百度知道芝麻将,申请资格&权限介绍&奖惩制度(简剖)

    芝麻将,即百度知道管理员.不及掌握,了解下也是好的. 知道圈子,把注册用户,成为芝麻.一般用户,即小芝麻.芝麻将,就是咱们说的知道管理员. 申请. 芝麻将,申请条件不是很难,难的是后续维护,申请前考虑 ...

  8. git push之后回滚(撤销)代码

    问题描述:首先,先说明一下,为什么会引发这次的话题,是这样的,我做完功能Agit push之后,2个月后需求部门要求不要功能A了,然后需要在没有功能A的基础上开发,怎么办?赶紧回滚代码呀. 然后我用g ...

  9. Logistic Regression学习笔记

    1.李航<统计学习方法>: 2.https://blog.csdn.net/laobai1015/article/details/78113214 3.http://www.cnblogs ...

  10. error:control reaches end of non-void function [-Werror=return-type]

    在做LeetCode上的题目时,出现了这个错误, 原代码如下: class Solution { public: vector<int> twoSum(vector<int>& ...