辗转相除法
2015-07-12 16:20
106 查看
辗转相除法:
当a % b=0 时gcd(a,b)=b,否则
gcd(a,b)=gcd(b,a%b)
原理:(来源于百度)
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互质【否则,可设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。
源代码:
View Code
当a % b=0 时gcd(a,b)=b,否则
gcd(a,b)=gcd(b,a%b)
原理:(来源于百度)
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互质【否则,可设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。
源代码:
#include<iostream> #include<cstdio> using namespace std; int gcd(int a,int b){ if (b==0) return a; else { cout<<a<<" "<<b<<endl; return gcd(b,a%b);} } int main(){ int a,b; cin>>a>>b; cout<<gcd(a,b); return 0; }
View Code
相关文章推荐
- git服务器
- 【转载】Apache Maven 入门篇(下)
- 6 种常用的项目管理模式
- 拓扑排序(一)
- Python实现简单的爬虫
- 拓扑排序(一)
- Linux C语言程序设计(五)——数组基本概念与解析
- Android基础入门
- 解决头文件相互包含问题的方法----超前引用
- arraylist结合iterator使用实例
- 【整合】矩阵树定理模板
- 优雅的处理Android数据库升级的问题
- HDU 2141二分小解
- 哎,系统分析师下午没过
- 关于异常“The specified child already has a parent. You must call removeView"的解决
- Mysql 主主复制实现
- Microsoft Communications Control组件解决方法
- iOS略屌的面试题
- nodejs学习之模块:crypto和body-parser
- 习题3.18 检测平衡符号(/* */ 不知怎么做)