求最大公约数算法(欧几里得算法)的实现!!!
2016-03-04 20:29
337 查看
看一个例子:试找出40和64的最大公约数
64 ÷ 40 = 1 ⋯⋯ 24
40 ÷ 24 = 1 ⋯⋯ 16
24 ÷ 16 = 1 ⋯⋯ 8
16 ÷ 8 = 2 ⋯⋯ 0
得到余数为0就以为着我们算到这一步就可以了。我们使用的最后一个余数是8,因此40和64的最大公约数就是8。
根据上图写一个递归函数来求解最大公约数
以被除数为a, 除数为b, 余数为ca ÷b = ...余 c ( c = a%b )
再将b作为被除数 , 余数作为除数...一直循环下去直到余数为0时,
最后一个除数就是答案
这就是欧几里得算法
递归边界:除数b为0, 那么获得这个新除数的a (这个a是上一个式子中的a%b),就是答案!
递归部分:除数b不为0 , 下一个式子的被除数是当前式子的除数b,
下一个式子的除数是当前式子的余数(a%b)
这样就可以写出一个递归函数:
int gcd(int a, int b) {
if(b == 0) return a; //递归函数先写边界
else return gcd(b, a%b); //再写递归的内容
}
再精简一下:
求最大公约数:
64 ÷ 40 = 1 ⋯⋯ 24
40 ÷ 24 = 1 ⋯⋯ 16
24 ÷ 16 = 1 ⋯⋯ 8
16 ÷ 8 = 2 ⋯⋯ 0
得到余数为0就以为着我们算到这一步就可以了。我们使用的最后一个余数是8,因此40和64的最大公约数就是8。
根据上图写一个递归函数来求解最大公约数
以被除数为a, 除数为b, 余数为ca ÷b = ...余 c ( c = a%b )
再将b作为被除数 , 余数作为除数...一直循环下去直到余数为0时,
最后一个除数就是答案
这就是欧几里得算法
递归边界:除数b为0, 那么获得这个新除数的a (这个a是上一个式子中的a%b),就是答案!
递归部分:除数b不为0 , 下一个式子的被除数是当前式子的除数b,
下一个式子的除数是当前式子的余数(a%b)
这样就可以写出一个递归函数:
int gcd(int a, int b) {
if(b == 0) return a; //递归函数先写边界
else return gcd(b, a%b); //再写递归的内容
}
再精简一下:
求最大公约数:
int gcd(int a, int b) { return b == 0 ? a : (b, a%b); }
相关文章推荐
- Java面试之一+=赋值符号的使用
- JavaScript:this 的工作原理
- 占座
- 操作系统面试题
- 入门训练
- 函数对象
- mysql基础知识
- 手机交互应用服务(震动器控制)
- 类和对象
- Java—面向对象—构造方法及相关思维导图
- RMQ模板
- c语言中位段的声明和结构
- PAT (Advanced Level) Practise 1020 Tree Traversals (25)
- 基础知识之进程通信
- 线段树-初识
- 模版类运算符重载
- IOS 开发 之 NSFileManager
- 认知计算是2万亿美元的盛宴,IBM喊你到碗里来!
- 【Memcached】集群搭建——memcached内存管理机制
- 结合遗传和蚁群算法的图像边缘特征提取