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

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. JDBCUtils工具类(转)

    JdbcUtils.java import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource ...

  2. @font-face css3自定义个性化字体

    使用第三方平台转换字体文件为font-face所支持的格式. TureTpe(.ttf)格式 支持浏览器:IE9+,Firefox3.5+,Chrome4+,Safari3+,Opera10+,iOS ...

  3. 关于Vue-cli 跨域,即使是非自己的服务器也可以get到内容

    刚入门vue ,打算用vue的脚手架做一个小项目.需要用到第三方的api,无奈遇到各种各样的问题. 比如 Access-Control-Allow-Origin ,或者使用了ajax的jsonp模式之 ...

  4. ABAP术语-Business Object Builder

    Business Object Builder 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/09/1031357.html Tool fo ...

  5. HTTP头部信息解释分析

    HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Chars ...

  6. jdbc学习笔记03

    作业: 1. 学生表(id,age,name) 2. 插入学生 3. 修改学生 4. 删除学生 5. 查询学生 JavaBean 俗称简单的Java对象 javaBean满足以下三点 1.私有属性 2 ...

  7. 使用Python对SQLite数据库操作

    SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在IOS和Android的APP中都可以集成. Python内 ...

  8. php-5.6.26源代码 - hash存储结构 - hash算法

    // zend_inline_hash_func 实现在文件“php-5.6.26\Zend\zend_hash.h” h = zend_inline_hash_func(arKey, nKeyLen ...

  9. 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法

    Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...

  10. MySQL基础复习

    三范式定义 1NF:每个数据项都是最小单元,不可分割,其实就是确定行列之后只能对应一个数据. 2NF:每一个非主属性完全依赖于候选码(属性组的值能唯一的标识一个元组,但是其子集不可以).  3NF: ...