方法一:枚举法
int test01(int a,int b)
{
int m=max(a,b);
int n=min(a,b);
for(int i=n;i>0;i--){
if(m%i==0&&n%i==0)
return i;
}
}
方法二:辗转相除法
int test02(int a,int b)
{
int m=max(a,b);
int n=min(a,b);
if(m%n==0)
return n;
return test03(m%n,n);
}
int test03(int a,int b)
{
int temp;
while(a%b)
{
temp=a%b;
a=b;
b=temp;
}
return b;
}
方法三:辗转相减法
int test04(int a,int b)
{
int m=max(a,b);
int n=min(a,b);
if(m%n==0)
return n;
else
return test05(m-n,n);
}
int test05(int m,int n)
{
while(m!=n)
{
if(m<n)
{
int temp=m;
m=n;
n=temp;
}
m=m-n;
}
return n;
}
方法四:求因数法
int test06(int a,int b)
{
//原理:任何大于等于1的数都可以表示为素数的乘积
int m=max(a,b);
int n=min(a,b);
int i;
for(i=2;i<=n;i++) //求两数的最小质因数
{
if(m%i==0&&n%i==0)
break;
}
if(m%i)return 1; //防止非break而退出循环
int flag=1;
while(flag)
{
for(int j=2;j*i<=n;j++) //依次求取两数最大公约数的质因数
{
if(m%(i*j)==0&&n%(i*j)==0)
{
i*=j;
flag=0;
}
}
flag=!flag;
}
return i;
}