求最大公约数的方法是辗转相除法,最小公倍数是两个数的积除以最大公约数。
递归的最大公约数:
int gcd(int a,int b)
{
if(a < b)
{
a = a^b;
b = a^b;
a = a^b;
}
if(b == 0) return a;
return gcd(b , a % b);
}
非递归算法:
int gcd(int a, int b)
{
if(a < b)
{
a = a^b;
b = a^b;
a = a^b;
}
int tmp=0;
while((tmp = a % b) != 0)
{
a = b;
b = tmp;
}
return b;
}
多个数的最大公约数:
int ngcd(int *pa, int n)
{
if(n == 1) return *pa;
return gcd(pa[n-1], ngcd(pa,n-1));
}
非递归算法:
int ngcd(int *pa, int n)
{
int res;
for(int i = 0; i < n; i++)
{
if(i == 0) res = pa[i];
else
{
res = gcd(res, pa[i]);
}
}
return res;
}
最小公倍数算法:
int lcd(int a, int b)
{
return a*b/(gcd(a,b));
}
多个数的最小公倍数:
int nlcd(int *pa, int n)
{
if(n == 1) return *pa;
return lcd(pa[n-1],nlcd(pa,n-1));
}
非递归算法:
int nlcd(int *pa, int n)
{
int res = 0;
for(int i = 0; i < n; i++)
{
if(i == 0) res = pa[i];
else res = lcd(res,pa[i]);
}
return res;
}