求最大公约数的两种解法(欧几里得算法和素数分解)

最大公约数的两种解法(欧几里得算法和素数分解)

方法一: 欧几里得算法,又称辗转相除法

定理(欧几里得算法):设a和b是正整数,则存在最大求最大公因子d=(a,b)的一种算法,且存在求一组整数s,t使得d = sa+tb

举个例子:求168和60的最大公约数?

                  168 = 2 * 60 + 48

                   60  = 1 * 48 +12

                   48  = 4 * 12

                 由此得最大公约数为12

关于最大公倍数

C语言程序代码:很简单就不加注释了

#include
#define SWAP(a,b) {a=a+b; b=a-b; a=a-b; }
int gcd(int a,int b)
{
	if(a==b)
		return a;
	if(a

方法二:素数分解

我们知道每一个大于等于2的整数都可以表示为几个素数相乘的形式(算术基本定理)而且有其对应的唯一的分解式,利用这点我们也可以用来求解最大公因子(最大公约数)

例如:在上题中168 可以表示为pow(2,3)*pow(3,1)*pow(5,0)*pow(7,1)

                            60可以表示为pow(2,2)*pow(3,1)*pow(5,1)*pow(7,0)

          所以(168,60) = pow*(2,2)*pow(3,1)*pow(5,0)*pow(7,0) = 12

#include
#include
#define COUNT_PRIME 10
void Divisor(int num,int prime[],int index,int& loop)//求分解的因子的个数
{
	if(num==1)
		return;
	int count = 0;
	while(num%index==0)
	{
		num /= index;
		count++;
	}
	if(index==2)
	{
		prime[index-2] = count;
		index += 1;
	}
	else
	{
		prime[index/2] = count;
		index += 2;
	}
	Divisor(num,prime,index,loop);
	loop += 1;
}
int Gcd(int a[],int b[],int loop_a,int loop_b)//求解最大公因子
{
	int gcd = a[0]

这里主要的函数在于求各个因子的个数,我使用了递归来解决这个问题

 

你可能感兴趣的:(算法,c/c++)