最大公約数の2種類の解法(ユークリッドアルゴリズムと素数分解)を求めます


最大公約数の2つの解法(ユークリッドアルゴリズムと素数分解)
方法1:ユークリッドアルゴリズム、転がり相除去法とも呼ばれる
定理(ユークリッドアルゴリズム):aとbを正の整数とすると、最大公因子d=(a,b)を求めるアルゴリズムが存在し、d=sa+tbとなる整数sのセットが存在する
例を挙げます: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:素数分解
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]

ここで主な関数は各因子の個数を求めることにあり,私は再帰を用いてこの問題を解決した.