The greatest common divisor gcd(最大公約数)
文章の一部には大神を参考にして共に努力するところがある.
最大公約数のアルゴリズムと言えば、一番熟知しているのは転々とした割り算で、もう一つはユークリッドアルゴリズムです. algorithm)最大公数を求める時、転々相除法は以下の性質を利用して二つの正の整数を確定します. a. 和 b の最大共通因子の値:
1. 若し r はい、 a. ÷ b の余り、 gcd(a,b) = gcd(b,r)
2. a. その倍数の最大共通因子は aです
もう一つの書き方は:
1. a. ÷ b、令rは所得剰余(0≦r<b)であり、もし r = 0,アルゴリズム終了;b 答えです
2. セット a←b、b←r、そして第一歩に戻る.
第一の書き方は再帰的に実現することです.第二の方法は、転々とした過程をより明確に見ることができます.実現コードは以下の通りです.
ここで百科を借りてその原理を説明します.「九章算術」は中国古代の数学専門書で、その中の「更相減損術」は2つの数の最大公約数を求められます.すなわち「半者半之、半可可可可以者半之、副置分母、子の数は少なく少なく、更に相減損して、それ等も求められます.」は現代語に訳して次のようになります. 第1ステップ:正の整数を任意に与え、それらが偶数であるかどうかを判断する.もし2で約簡するならば.第二ステップを実行しない場合.第二ステップ:大きな数でより小さい数を減らし、続いて所得の差をより小さい数と比較し、大きな数で小数を減らす.この操作は、得られた減数と差が等しくなるまでループします.第一歩の中で約束したいくつかの2と第二歩の中ぐらいの数の積は求められた最大公約数です.その中で「等数」というのは、最大公約数です.「等数」を求める方法は「更相減損」法です.
コードは以下の通りです
最大公約数のアルゴリズムと言えば、一番熟知しているのは転々とした割り算で、もう一つはユークリッドアルゴリズムです. algorithm)最大公数を求める時、転々相除法は以下の性質を利用して二つの正の整数を確定します. a. 和 b の最大共通因子の値:
1. 若し r はい、 a. ÷ b の余り、 gcd(a,b) = gcd(b,r)
2. a. その倍数の最大共通因子は aです
もう一つの書き方は:
1. a. ÷ b、令rは所得剰余(0≦r<b)であり、もし r = 0,アルゴリズム終了;b 答えです
2. セット a←b、b←r、そして第一歩に戻る.
第一の書き方は再帰的に実現することです.第二の方法は、転々とした過程をより明確に見ることができます.実現コードは以下の通りです.
int gcd(int m,int n) //
{
if(n==0)
return m;
else
return gcd(n,m%n);
}
// : n=gcd(a,b);
int gcd(int m,int n) //
{
if(n==0)
return m;
else
return gcd(n,m%n);
}
// : n=gcd(a,b);
今日初めて他の最大公約数アルゴリズムを理解しました.もっと相減損法(等値アルゴリズム)は、個人的にも転々相減法として理解できると思います.ここで百科を借りてその原理を説明します.「九章算術」は中国古代の数学専門書で、その中の「更相減損術」は2つの数の最大公約数を求められます.すなわち「半者半之、半可可可可以者半之、副置分母、子の数は少なく少なく、更に相減損して、それ等も求められます.」は現代語に訳して次のようになります. 第1ステップ:正の整数を任意に与え、それらが偶数であるかどうかを判断する.もし2で約簡するならば.第二ステップを実行しない場合.第二ステップ:大きな数でより小さい数を減らし、続いて所得の差をより小さい数と比較し、大きな数で小数を減らす.この操作は、得られた減数と差が等しくなるまでループします.第一歩の中で約束したいくつかの2と第二歩の中ぐらいの数の積は求められた最大公約数です.その中で「等数」というのは、最大公約数です.「等数」を求める方法は「更相減損」法です.
コードは以下の通りです
int gcd(int m,int n) //
{
while(m!=n) //
{
if(m>n)
m-=n;
else
n-=m;
}
return m;
}
実現コードは以下の通りです.私は小水に属していますので、簡単なものは忘れやすいです.コードにはいくつかの変数交換方式が付加されています.#include
#include
using namespace std;
int gcd(int m,int n) //
{
if(n==0)
return m;
else
return gcd(n,m%n);
}
/*
int gcd(int m,int n) //
{
int p;
while(n)
{
p=m%n;
m=n;
n=p;
}
return m;
}
int gcd(int m,int n) //
{
while(m!=n)
{
if(m>n)
m-=n;
else
n-=m;
}
return m;
}
*/
void swap(int &m,int &n) // , ( )
{
int temp;
temp=m;
m=n;
n=temp;
}
/*void swap(int *m,int *n) // ,
{
int temp;
temp=*m;
*m=*n;
*n=temp;
}
:swap(&m,&n);
int swap(int &m,int &n) // , ( )
{
m=m+n;
n=m-n;
m=m-n;
}
:swap(m,n);
int swap(int &m,int &n)
{
m=m^n;
n=n^m;
m=m^n;
}
:swap(m,n);
*/
int main()
{
int a,b;
while(1)
{
printf("please enter the two positive integers: ");
scanf("%d%d",&a,&b);
if(a