引:求非零数m,数n 的最大公约数
法一:欧几里得算法:
思路:gcd(m,n)=gcd(n,m mod n)
(1)如果 n = 0 ,返回 m 的值作为结果; 否则,进入第二步
(2) 令 r = m mod n
(3) 令 m = n , n = r
//循环写法
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int n,int m)
{
int r;
while(n!=0)
{
r=m%n;
m=n;
n=r;
}
return m;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<gcd(n,m);
return 0;
}
//递归写法
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int m,int n)
{
if(n==0) return m;
return gcd(n,m%n);
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n);
return 0;
}
法二:连续整数检测算法
思路:从m,n中最小的数递减,一个个检查哪个数可以被m,n整除
(1)t = min(m,n)
(2) x= m mod t, 如果x=0 ,进入第三步;否则,进入第四步
(3)y= n mod t,如果y=0,输出m 否则,进入第四步
(4)t-- ,返回第二步
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int n,int m)
{
for(int t=min(n,m);;t--)
{
if(m%t==0 && n%t==0) return t;
}
}
int main()
{
int n,m;
cin>>n>>m;
cout<<gcd(n,m);
return 0;
}
法三: 求m,n所有质因数=>最大公约数
思路:
(1)求m的所有质因数
(2)求n的所有质因数
(3)找出m,n共有的质因数,取min{共有质因数乘m中的次数,共有质因数乘n中的次数}
(4)将第三步所有所得的数相乘