求解最大公约数常用欧几里得算法(辗转相除法)。
欧几里得算法基于下面这个定理:
设a、b均为正整数,则递归式:gcd(a,b) = gcd(b,a%b)。
递归边界:gcd(a,0)=a。
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int m,n,result;
while(scanf("%d%d",&m,&n)!=EOF)
{
cout<<gcd(m,n);
}
return 0;
}
运行结果:
求解最小公倍数:
就是将两个数相乘再除以最大公约数,设d为最大公约数则a,b的最小公倍数为ab/d
由于ab实际计算时可能存在溢出问题,所以更恰当的写法为a/db。
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(b==0)return a;
else return gcd(b,a%b);
}
int main()
{
int m,n,result;
while(scanf("%d%d",&m,&n)!=EOF)
{
result=gcd(m,n);
cout<<m/result*n;
}
return 0;
}
运行结果: