问题描述:求解两个整数m和n的最大公因子?
方法1:直接试探法
求解这个函数很简单,依次取2-min(m,n) 中的每个数来判断,最后一个满足条件的数就是最大的因子。代码实现如下:
#include<iostream>
using namespace std;
int main(){
int hcf(int m,int n);
cout<<hcf(24,12)<<endl;
return 1;
}
int hcf(int m,int n){
int h;//定义h记录各个公因子值
//for(int i=2;i<min(m,n);i++)
//这个min(m,n)可以使用(m<n?m:n)简化替代
for(int i=2;i<=(m<n?m:n);i++)
{
if(m%i==0&&n%i==0){
h=i;
}
}
return h;
}
法一的方法简单,但性能上比较差,因为只有最后一个解是我们需要的,所以我们考虑改进,改变循环求解的顺序、这在原理上还是一样的是直接试探法。
代码:
#include<iostream>
using namespace std;
int main(){
int hcf(int m,int n);
cout<<hcf(24,12)<<endl;
return 1;
}
int hcf(int m,int n){
int h=(m<n?m:n);
//定义h记录最后一个公因子值
//这个min(m,n)可以使用(m<n?m:n)简化替代
while(m%h!=0||n%h!=0){
h--;
}
return h;
}
2.质因子分解法
这个方法其实就是我们小学课本上常用的方法,对他们公因子求解,从最小的去分解,最后将所得到的公因子做乘法运算即可:
代码:
#include<iostream>
using namespace std;
int main(){
int hcf(int m,int n);
cout<<hcf(24,12)<<endl;
return 1;
}
//质因子分解法
int hcf(int m,int n){
int h=1;
//定义h记录最后一个公因子值
//这个min(m,n)可以使用(m<n?m:n)简化替代
int k=2;//最小的公因子
//限定公因子范围
while(k<=(m<n?m:n)){
if(m%k==0&&n%k==0){
m=m/k;//m除以k后的商
n=n/k;//n整除k后的商
h=h*k;//h存储最大的公因子
}
else k++;//看看后面的公因子能否被除
}
return h;
}
这种方法的性能比很高,我们在实际的过程中一般都会使用这个方法,但值得注意的是,当m和n都很大,但公因子数又很少时,特别是m和n互为质数时,求解的次数将为min(m,n)个,这样的情况明显不是我们想要的。
3,辗转相除法
这个方法的描述需要慢慢理解:
对于给点的整数m和n ,我们定义其中最大的数max(m,n)=min(m,n)*q+r;
也就是说,最大数除以最小数的商是q ,余数是r;这里我们是有(m,n)来表示这个运算
接下来我们可以定义求解的规则:(m,n)=(n,r),一直这样做下去,直到发现(n,0)或者是说(1,0)互质,就可以得到我们需要的最大公因子
例如下例:
(500,150)=(150,50)
=(50,0)
=50 50为解
又如
(60,24)=(24,12)
=(12,0)
=12 12为解
(10,3)=(3,1)
=(1,0)
=1 1为解,说明10和3互为质数
求解代码如下:
#include<iostream>
using namespace std;
int main(){
int hcf(int m,int n);
cout<<hcf(24,12)<<endl;
return 1;
}
//辗转相除法分解法
int hcf(int m,int n){
int max=(m<n?m:n);//先确定m和n最大数作为除数
int min=(m<n?m:n);//先确定m和n最小数作为被除数
int r;//定义r作为每次运算的余数
//这个min(m,n)可以使用(m<n?m:n)简化替代
//限定公因子范围
while(r!=0){
r=max%min;
max=min;//为下一次的运算除数做准备
min=r;//为下一次的运算被除数做准备
}
return max;//当余数为0的时候,除数就是最大的公因子
}
性能分析:这种方法是最为迅捷准确的,是我们理想的求解方法,速度和空间的要求都达到了最好的水平。
对于我们程序员来讲:这个方法是必须掌握的。非常的重要。
本文介绍了三种求解两个整数最大公因子(GCD)的方法:直接试探法、质因子分解法和辗转相除法。通过代码实例展示了每种方法的实现,并分析了它们的性能和适用场景。质因子分解法在实际中常用,而辗转相除法在效率和准确性上表现最佳,是程序员必须掌握的方法。

5111

被折叠的 条评论
为什么被折叠?



