基于二进制计算最大公约数的算法。

程序来自维基百科。

#include <stdio.h>// Recursive version in C
unsigned int gcd(unsigned int u, unsigned int v)
{// simple cases (termination)if (u == v)return u;if (u == 0)return v;if (v == 0)return u;// look for factors of 2if (~u & 1) // u is even{if (v & 1) // v is oddreturn gcd(u >> 1, v);else // both u and v are evenreturn gcd(u >> 1, v >> 1) << 1;}if (~v & 1) // u is odd, v is evenreturn gcd(u, v >> 1);// reduce larger argumentif (u > v)return gcd((u - v) >> 1, v);return gcd((v - u) >> 1, u);
}// Iterative version in C
unsigned int gcd2(unsigned int u, unsigned int v)
{int shift;/* GCD(0,v) == v; GCD(u,0) == u, GCD(0,0) == 0 */if (u == 0) return v;if (v == 0) return u;/* Let shift := lg K, where K is the greatest power of 2dividing both u and v. */for (shift = 0; ((u | v) & 1) == 0; ++shift) {u >>= 1;v >>= 1;}while ((u & 1) == 0)u >>= 1;/* From here on, u is always odd. */do {/* remove all factors of 2 in v -- they are not common *//*   note: v is not zero, so while will terminate */while ((v & 1) == 0)  /* Loop X */v >>= 1;/* Now u and v are both odd. Swap if necessary so u <= v,then set v = v - u (which is even). For bignums, theswapping is just pointer movement, and the subtractioncan be done in-place. */if (u > v) {unsigned int t = v; v = u; u = t;}  // Swap u and v.v = v - u;                       // Here v >= u.} while (v != 0);/* restore common factors of 2 */return u << shift;
}int main(void)
{unsigned m = 140, n = 42;printf("gcd1: %u %u result=%u\n", m, n, gcd(m, n));printf("gcd2: %u %u result=%u\n", m, n, gcd2(m, n));return 0;
}

Binary GCD algorithm相关推荐

  1. 一些有意思的算法代码[转载]

    转载自:http://coolshell.cn/articles/6010.html Keith Schwarz是一个斯坦福大学计算机科学系的讲师.他对编程充满了热情.他的主页上他自己正在实现各种各样 ...

  2. maple java,讲解:MACM 401、Maple worksheet、Java,Python、Java,c++SQL|

    讲解:MACM 401.Maple worksheet.Java,Python.Java,c++SQL|MACM 401/MATH 801Assignment 1, Spring 2019.Micha ...

  3. 模拟NAND FLASH 读写BCH ECC校验

    一.模拟NAND FLASH 读写BCH ECC校验 将内核源码里的bch校验程序分离出来,从而可以手动修改原始数据和bch校验码,达到模拟出错纠正过程. 源码 bch.c.bch.h.types.h ...

  4. 二进制搜索树_二进制搜索树数据结构举例说明

    二进制搜索树 A tree is a data structure composed of nodes that has the following characteristics: 树是由具有以下特 ...

  5. 如何解决JavaScript中的根查找

    介绍 (Introduction) I've been wanting to write about this topic for a while now. I recently had the op ...

  6. 二进制搜索算法_使用安全摄像机镜头解释二进制搜索算法

    二进制搜索算法 by Julia Geist Julia·盖斯特(Julia Geist) 使用安全摄像机镜头解释二进制搜索算法 (Binary Search Algorithms explained ...

  7. java中Arrays的用法

    1. atList方法:返回一个固定大小的list Modifier and Type Method and Description static <T> List<T> as ...

  8. 资料收集--Subversion与CVS的优势

    一.Subversion包含绝大部分CVS功能 Subversion 作为CVS 的重写版和改进版,其目标就是作为一个更好的版本控制软件,取代目前流行的CVS.Subversion 的主要开发人员都是 ...

  9. SpringBoot 集成ip2region

    一. 什么是ip2region ip2region:可以根据他获取一个具体ip的信息,国家.具体地址.网络服务商 二.添加依赖 <dependency><groupId>org ...

最新文章

  1. 学习鸟哥的Linux私房菜笔记(3)——基础使用
  2. hdu 3264(二分+圆相交面积)
  3. 转,jquery中attr和prop的区别
  4. SetWindowLong代码设置窗体borderStyle风格 TOOLWINDOW
  5. 23种设计模式及案例整理分享(建议收藏)
  6. 关于在window下使用docker的备选方案
  7. 前端使用a标签下载文件并修改文件名
  8. wepe重装win10用U盘安装系统
  9. Android仿微信语音录制和播放
  10. 再见了,少年——转自有意思吧
  11. BLDC无刷电机驱动板,foc驱动板,有霍尔接口,反电动势接口,三相电流采集接口
  12. QT使用tableWidget显示双排列表 并且选中用红框圈出来
  13. 正则^[a-zA-Z\d]+$
  14. 2022年8月29日 勒索病毒大爆发
  15. 基于Python操作Word
  16. 建筑业和VECP项目(上)
  17. 「书评」聊聊打CTF的那本书
  18. 用户界面设计应该用那些软件?
  19. FDTD Solutions时域有限差分法仿真学习相关操作(二)——圆偏振光和椭圆偏振光光源
  20. 【读书笔记】Linux内核设计与实现--中断和中断处理

热门文章

  1. 在64位操作系统上使用FlashDevelop的Debug功能
  2. java static调用吗_java中使用static
  3. chrome jsp 显示不正常_selenium+java谷歌浏览器 网站打开不正常
  4. mac os android sd卡,关于 Mac 上的 SD 和 SDXC 卡插槽
  5. 导出域控中不活动的计算机_满满干货丨小薇和你聊聊计算机二级的那些事儿
  6. fanuc机器人与示教器配对_看FANUC机器人在重力浇铸行业,都是又累又重的活儿啊!...
  7. 剑指offer面试题65. 不用加减乘除做加法(位运算)
  8. 《自动驾驶网络解决方案白皮书》研读(一):电信产业自动驾驶网络探索与实践
  9. Tableau可视化学习笔记:day11-12
  10. php ajax 增删改查 分页,Jquery之Ajax_分页及增删改查