博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大公约数
阅读量:4973 次
发布时间:2019-06-12

本文共 1339 字,大约阅读时间需要 4 分钟。

转载:https://www.cnblogs.com/hexiaochun/archive/2012/09/03/2668250.html

 

今天研究了一下最大公约数的求法,在网上也找了不同的解法,现在就想总结一下,拿出来分享给大家,共同 学习

首先讲一个什么是公约数,这个问题我们小学都学过,可能有一部分人已经忘记了,所以还是讲一下,假设有两个数a,b,所谓的公约数就是能把a,b整除的最大整数。
明白了要求我们就来解决问题,一拿到问题我们都应该都能想到一个方法,就是使用穷举法,从2开始一个个找,到一个两个都能除的就记录起来,一直找到小于min(a,b)结束,
记录到的值就是他们的最大公约数代码由下:

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
//找出最大公约数,穷举法
       
public 
static 
int 
getMaxDivide_ab(
int 
a,
int 
b){
               
int 
value=
1
;
               
int 
max;
               
int 
min;
               
if
(a==b){
                       
return 
a;
               
}
               
if
(a>b){
                       
max=a;
                       
min=b;
               
}
else
{
                       
max=b;
                       
min=a;
               
}
               
for
(
int 
i=
2
;i<min;i++){
                       
if
(
0
==max%i &&
0
==min%i){
                               
value=i;
                       
}
               
}
               
return 
value;
       
}

第二种方法是使用欧几里德算法,这个已经有2000+年的历史了,这个比起上一个来的要高效,假设我们的最大公约数表示为f(a,b),并且有a>=b>0,
欧几里德就给了我们一个很好的定理,f(a,b)=f(b,a%b),有了这个等式我们就很容易得出这个算法的递归式,现在我们来看下这个等式是怎么来的
设有 r=a/b ,q=a%b  
所以就有 a=a/b*b+q  ----(这里的a/b*b!=a   ,原因就是我们用的是整数来计算的)
也就是a=r*b+q     变换一下有:q=a-r*b      设d=f(a,b),a/d=m,b/d=n;则  有q=dm-r*dn=d(m-rn)
所以q/d也为0;设d|q表示d是q的约数;以下相同;
又有d|b;所以有d|(b,q),设D是(b,q)的最大公约数,则会有d<=D=f(b,q);
再回到前面r=a/b,q=a%b这两个条件有
a=r*b+q,由于D|(b,q),所以D|a,所以有D|(a,b)
所以有D<=d=f(a,b),结合上部分就有d<=D <+d,及D=d;
所以得证;
代码实现由下:

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
public 
static 
int 
oujilide(
int 
a,
int 
b){
               
if
(a<b){
                       
int 
temp;
                       
temp=a;
                       
a=b;
                       
b=temp;
               
}
               
if
(
0
==b){
                       
return 
a;
               
}
               
return 
oujilide(b,a%b);
       
}

转载于:https://www.cnblogs.com/xiaolovewei/p/8037846.html

你可能感兴趣的文章
分块学习
查看>>
UIWebView 屏蔽或者修改 alert警告框
查看>>
Qt-第一个QML程序-3-自定义一个按钮
查看>>
分布式系统事务一致性解决方案
查看>>
树梅派中文输入法支持
查看>>
[Git] 005 初识 Git 与 GitHub 之分支
查看>>
使用Analyze 和Instruments-Leaks分析解决iOS内存泄露
查看>>
Vue.js的入门
查看>>
【自定义异常】
查看>>
pip install 后 importError no module named "*"
查看>>
一些疑惑
查看>>
Codeforces Round #413 A. Carrot Cakes
查看>>
Linux(Ubuntu16.04)下添加新用户
查看>>
Windows c++应用程序通用日志组件(组件及测试程序下载)
查看>>
openstack dpdk
查看>>
springmvc跳转方式
查看>>
Linux安装Redis
查看>>
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
Redis中7种集合类型应用场景
查看>>