最大公約数の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言語プログラムコード:簡単に注釈を付けない
方法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
ここで主な関数は各因子の個数を求めることにあり,私は再帰を用いてこの問題を解決した.
方法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]
ここで主な関数は各因子の個数を求めることにあり,私は再帰を用いてこの問題を解決した.