求最大公约数的4种方法(C/C++实现) |
您所在的位置:网站首页 › 辗转相除法求最大公约数vb编程 › 求最大公约数的4种方法(C/C++实现) |
1.欧几里得(辗转相除法)
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。 这里通过一个简单的递归函数就可以实现(这里只写关键代码) 这里为了方便阅读写得比较啰嗦, 当然这里也可以用三目运算符一条语句完成。 return a % b ? Gcd(b, a % b) : b; 2.更相减损法更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。 这种算法的原理就是用大的数-小的数,然后重复此过程,直到两个数相等即为所求。 这里通过一个简单的递归函数就可以实现(这里只写关键代码) 当然这里也可以使代码写得更简便些。(后面那种算法会解释) 3.stein算法欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。 这里不得不提一嘴gcd(a,b)=2*gcd(a/2,b/2)//a,b都是偶数 当两个数只有一个是偶数时(假设a为偶数)gcd(a,b)=gcd(a/2,b); 所以我们就可以设计这种算法,关键代码如下 (这里就需要讲一下按位异或^这个比较有意思的操作符了; 按位异或^,就是各个2进制位相同为0,相异为1; 这里要记住两个比较有用的公式 a^a=0;(a是一个整数) 0^a=a; 当然其他一些移位操作符我在第一篇文章时就有提及了,不懂的可以参考一下我写的第一篇文章。 4.当然这里我们也可以直接使用库函数C++:定义在algorithm头文件中的__gcd()函数是用来求两个数的最大公约数的; 本次分享就到这里啦!! 最后说一下,这里的算法写得比较详细,我也是一个算法初学者,所以这篇文章主要是针对初学者,对小白的帮助还是挺大的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |