C++求两个数的最大公约数
方法一:可以想到两个数的最大公约数可能是两个数的min,最小可能是1。所以,可以设最大公约数从min开始进行判断,如果gcd大于1并且不能同时整除m和n,那么就gcd-1,重复判断是否整除。
#include<iostream>
using namespace std;
int main(){
int m,n,gcd;
cin>>m>>n;
gcd=m>n?n:m;
while (gcd>1&&(m%gcd!=0||n%gcd!=0))
{
gcd--;
}
cout<<gcd<<endl;
return 0;
}
方法二:欧几里德算法,对于任意两个自然数m和n,用m,n,r分别表示被除数,除数,余数,m和n的最大公约数等于n和r的最大公约数,以下是辗转相除法
- 求m除以n的余数r
- 当r!=0时,执行第3步;若r==0,则n为最大公约数,算法结束
- 将n的值赋值给m,r的值赋值给n,再求m除以n的余数r
- 转到第2步
#include<iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int r=m%n;
while(r!=0){
m=n;
n=r;
r=m%n;
}
cout<<"gcd="<<n<<endl;
return 0;
}