1.最大公约数:
其实在实际要用的时候也没有必要自己写,库里面有,如下
要注意gcd前面是两个下划线
算法思想是欧几里得的辗转相除法,gcd(a,b)=gcd(b,a%b)。
如果需要高精度,只需将除法改成减法,即gcd(a,b)=gcd(b,a-b)。
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
或者
int gcd(int a,int b){
if(a<b)//保证后面辗转相除时a>b
{//位运算交换两数
a=a^b;
b=a^b;
a=a^b;
}
while(b!=0)
{
r=a%b;
a=b; / /循环求余数
b=r;
}
return a;
}
2.最小公倍数:
最小公倍数的求法利用了最大公约数,即lcm(a,b)=a/gcd(a,b)*b
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
或者
int lcm(int a,int b){
int aa=a,bb=b;
if(a<b)//保证后面辗转相除时a>b
{//位运算交换两数
a=a^b;
b=a^b;
a=a^b;
}
while(b!=0)
{
r=a%b;
a=b; / /循环求余数
b=r;
}
return aa/a*bb;
}
注意: 不要写成a*b/gcd(a,b),看似相等,但是当a和b很大时会溢出的