欧几里德算法(辗转相除法)
2016-03-01 00:23
176 查看
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b)
欧几里得
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
a % d == 0 , b % d == 0,而r = a - kb,因此 r % d == 0
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
b % d == 0 , r % d == 0 ,但是a = kb +r 所以 a % d == 0
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的.
欧几里得
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
a % d == 0 , b % d == 0,而r = a - kb,因此 r % d == 0
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
b % d == 0 , r % d == 0 ,但是a = kb +r 所以 a % d == 0
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的.
#include<iostream> using namespace std; int gcd(int a, int b) { if (a < b){ int temp = a; a = b; b = a; } if (a%b == 0) return b; else return gcd(b, a%b); //return b == 0 ? a : gcd(b, a%b); 这一行代码是可行的哈,被我注释掉是因为太精妙了!!!gcd函数里求的最大公约数这一句就够了! } int main() { int a = 252, b = 105; int res = gcd(a, b); cout << res << endl; return 0; }
相关文章推荐
- 僵尸进程的产生和避免
- linear regression
- android studio 新建项目错误
- 2016-02-29
- 网络编程中的序列化和反序列化
- CACurrentMediaTime , CFAbsoluteTimeGetCurrent, NSDate 区别
- 2016/3/1 淘宝 腾讯 网易 css初始化代码 以及最基础的初始化
- UItextFied 的属性
- PHP中isset,empty,is_null的使用方法和区别
- Android 中 ListView分组排序显示数据
- JSP通过Servlet提交表单数据并显示
- vim基本使用
- Linux设备模型(2)_Kobject
- UVa1587
- MySQL知识(二十四)——MySQL日志
- 利用Fiddler 解SSL加密 数据包
- 什么是usbmuxd? iDevice通过USB与桌面系统通信原理小科普
- Web 服务器基准测试,nginx+php vs Apache+php
- Web 服务器基准测试,nginx+php vs Apache+php
- Web 服务器基准测试,nginx+php vs Apache+php