最大公約数の設計とC言語の実現を求めます


最大公約数を求めるのはよくある数学の問題で、数学の思考の中でよく使われる求法は指数分解、短除法、転がり相除法と更相減損法があり、その中の前の2つのアルゴリズムはコードを通じて実現する効率が非常に低く、私が考えることができる方法はまず1つの質量数を求めるアルゴリズムの表現式で無限大の質量数の集合を表す必要があるだけで、それから更に模範的に判断してみる.成功したら分解します.ここでは主に後の2つのアルゴリズムの設計とC言語の実現を研究する.
1、転がり相殺法
その方法はその名の通り、大数モードの小数を余剰とし、余剰を小数と比較し、大数モードの小数を余剰とする操作を繰り返し続け、大数モードの小数が0になるまで、小数はこの2つの数の最大公約数であり、ユークリッドアルゴリズムとも呼ばれる.この過程で私たちは何度も大数と小数を判断しなければならないので、小数の値が大数より大きいと、2つの数を交換する必要があるので、ここではまず1つの交換2つの整形の方法をカプセル化することができて、判断を最大公約数を求める関数の中に置くことができて、判断野をカプセル化する必要はありません.このように関数呼び出しの回数をできるだけ小さくすることができます.能率を高める.
パッケージ交換整形のコードは以下の通りである.
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

次に考えなければならないのは、転がり相殺アルゴリズムを実現するコードです.説明することで、私たちは簡単に書くことができます.コードは以下の通りです.
int DetGreatestCommonDivisor(int max,int min)//     
{
while (max)
{
if (min > max)
swap(&min, &max);
max = max%min;
}
return min;
}

2、更相減損法、更相減損術とも呼ばれ、九章アルゴリズムから出た.そのアルゴリズムの核心はまず二つの数が偶数であれば、偶数を2つ除いて大きさを判断し、大数で小数を減らし、それから以上の操作を繰り返し、大数が小数を0に減らすまで、この小数または大数がそれらの最大公約数である.「可半者半之、不可半者、副置分母、子の数、少減多、更相減損、その等を求める.
コードは次のように実装されます.
int GetGreatestCommonDivisor(int max, int min)//     
{
while (max)
{
while (min % 2 == 0)
{
 min /= 2;
}
while (max % 2 == 0)
{
 max /= 2;
}
if (min > max)
swap(&min, &max);
max = max - min;
}
return min;
}

不足があればご指摘ください