求两个正整数最大公约数的三种算法
1.欧几里德算法:
gcd(m,n)
其中m>=n,其递归定义为:
gcd(m,n)= m , n=0
gcd(n,m mod n) ,n>0
1,欧几里得算法描述方法一
自然语言描述:
第一步:如果n=0,返回m的值作为结果,同时过程结束;否则,进入第二步。
第二步:用n去除m,将余数赋给r。
第三步:将n的值赋给m,将r的值赋给n,返回第一步。
2,欧几里得算法描述方法二
伪代码描述
算法,Euclid(m,n)
//使用欧几里得算法计算gcd(m,n)
//输入:两个不全为零的非负整数m,n。
//输出:m,n的最大公约数
while n <>o do
{r<- m mod n
m<-n
n<-r}
return m
3,欧几里得算法描述三
C语言描述
算法Euclide(m,n)
//使用欧几里得算法计算gcd(m,n)
//输入:两个不全为零的非负整数m ,n。
int Euclid(int m,int n)
{int r;
while(n!=0)
{
r=m%n;
m=n;
n=r;
}
return m;
}
2,连续整数检测算法
算法思想:基于最大公约数的定义:同时整除两个整数的最大整数。
显然,不会大于两个数的最小值,所以令t = min(m,n)
用t除以m,n,若除尽,t即最大公约数;否则令:t=t-1,继续尝试。
用自然语言进行描述:
第一步:将min{m,n}的值赋给t。
第二步:m除以 t,如果余数为0,进入第三步;否则,进入第四步。
第三步:n除以 t,如果余数为0,返回t 值作为结果;否则,进入第四步。
第四步:将t 值减1,返回第二步。
3.埃拉托色尼“筛”算法:
算法思想:
**首先初始化一个2~n的连续序列,作候选素数。
**第一个循环消去2的倍数;
**然后,指向序列的下一个数字3,消去其倍数
**接下来指向5,消去其倍数
**按此方法不断做下去,直到序列中没有可消元素
例如:gcd(60,24)=
60 = 2*2*3*5
24=2*2*2*3
找出公共的因子:所以等于2*2*3=12