计算最大公因数方法总结
(还有最小公倍数)
最小公因数即是最大的公共因数(gcd)。
暴力破解
#include <stdio.h>
void max(int *pa ,int *pb)
{
int t;
if(*pb > *pa)
{
t = *pa;
*pa = *pb;
*pb = t;
}
}
int main()
{
int a ,b ,i ,gcd;
scanf("%d%d",&a ,&b);
max(&a ,&b);
for(i = 1;i <= a; i++)
{
if(a % i ==0 && b % i == 0)
gcd = i;
}
printf("%d",gcd);
return 0;
}
分解质因数法
把两数分别分解质因数,再把共有的质因数相乘即得最大公因数。
#include <stdio.h>
int x[1000] = {0} ,y[1000] = {0} ,xa ,yb;
void max(int *pa ,int *pb)
{
int t;
if(*pb > *pa)
{
t = *pa;
*pa = *pb;
*pb = t;
}
}
void zhiyinshua(int n)
{
int i ,j = 1 ,nn;
nn = n;
for(i = 2;i <= nn; i++)
{
for(;;)
{
if(n % i == 0)
{
x[j] = i;
j++;
n = n / i;
continue;
}
else break;
}
}
xa = j;
}
void zhiyinshub(int n)
{
int i ,j = 1 ,nn;
nn = n;
for(i = 2;i <= nn; i++)
{
for(;;)
{
if(n % i == 0)
{
y[j] = i;
j++;
n = n / i;
continue;
}
else break;
}
}
yb = j;
}
int main()
{
int a ,b ,i ,j ,gcd = 1;
scanf("%d%d",&a ,&b);
max(&a ,&b);
zhiyinshua(a);
zhiyinshub(b);
for(i = 1;i < xa; i++)
{
for(j = 1;j < yb; j++)
{
if(x[i] == y[j])
{
gcd *= x[i];
x[i] = y[j] = 0;
break;
}
}
}
printf("%d",gcd);
return 0;
}
代码写得很蠢英文也不会打
更相减损术
更相减损术出自《九章算术》。
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
对于两个不同的数,如果都是偶数则将他们除以二直到不都是偶数为止,然后把两数相减,减数与差相减(大减小)……直到减数与差相等为止,然后把差乘上一开始除掉的数个2就得到最大公因数。
#include <stdio.h>
void max(int *pa ,int *pb)
{
int t;
if(*pb > *pa)
{
t = *pa;
*pa = *pb;
*pb = t;
}
}
int gxjss(int a ,int b)
{
if(b > a)
{
a = a + b;
b = a - b;
a = a - b;
}
if(a - b == b)
return b;
else
return gxjss(b ,a - b);
}
int main()
{
int a ,b ,i ,gcd ,pow = 1;
scanf("%d%d",&a ,&b);
max(&a ,&b);
for(;;)
{
if(a % 2 == 0 && b % 2 ==0)
{
a >>= 1;
b >>= 1;
pow <<= 1;
}
else
break;
}
gcd = pow * gxjss(a ,b);
printf("%d",gcd);
return 0;
}
辗转相除法
大的数除以小的数,如果余数不为0,则除数与余数继续相除,直到余数为0,最大公因数即为最后一除的除数。
#include <stdio.h>
typedef long long ll;
ll getgcd(ll a, ll b){
return b == 0? a: getgcd(b, a%b);
}
int main()
{
ll a ,b ,gcd;
scanf("%lld%lld",&a ,&b);
gcd = getgcd(a,b);
printf("%lld",gcd);
return 0;
}