1.欧几里得算法:gcd(m,n);
m>=n,其递归定义为:
n=0时 gcd(m,n)=m;
n>0时 gcd(m,n)=gcd(n,m%n);
eg:m=60,n=24
gcd(60,24)=gcd(24,60%24=12)
gcd(24,12)=gcd(12,24%12=0)
gcd(12,0)=12
自然语言描述:
1.如果n=0,则返回m为最大公约数,同时过程结束,否则进入第二步
2.令n去除m,得到余数r,将n的值赋给m,将r的值赋给n,返回第一步
#include<iostream>
using namespace std;
int gcd(int m,int n)
{
if(n==0)
return m;
else
return gcd(n,m%n);
}
int main()
{
int m,n; cin>>m>>n;
cout<<gcd(m,n);
return 0;
}
2.连续整数检测算法
算法思想:
基于最大公约数的定义:同时整除两个整数的最大整数;
显然,最大公约数t不会大于两者中最小的那一个,则令 t=min(m,n);
用t除m,n,若除尽则t为最大公约数;否则,令t=t-1,继续尝试;
#include<iostream>
using namespace std;
int gcd(int m,int n,int t)
{
if(m%t==0&&n%t==0)
return t;
else
return gcd(m,n,t-1);
}
int main()
{
int m,n;cin>>m>>n;
int t=min(m,n);
cout<<gcd(m,n,t);
return 0;
}