ユークリッドの互除法
アルゴリズムの実装
ではまず、ユークリッドの互除法から説明していきましょう。C言語でユークリッドの互除法を実装すると、いかのようになります。
#include <stdio.h> void main(){ int m , n, d; printf("一つ目の数:"); scanf("%d", &m); printf("二つ目の数:"); scanf("%d", &n); // m < nであれば、mとnを入れ替える if (m > n){ int tmp = m; m = n; n = tmp; } do{ d = m % n; m = n; n = d; } while (d != 0); printf("二つの数の最大公約数は最大公約数は%dです。¥n", m); }
プログラムを実行すると、コンソールから、二回せいすうのあたいを入力するように求めてきます。入力すると、その数値の最大公約数が表示されます。
実行結果
一つ目の数:36
二つ目の数:48
二つの数の最大公約数は最大公約数は48です。
二つ目の数:48
二つの数の最大公約数は最大公約数は48です。
エラトステネスのふるい
アルゴリズムの実装
続いて、エラトステネスふるいをC言語で実装したものを紹介します。以下のサンプルは、100までの素数を算出するものです。定数Nの値を変えれば、その数までの素数を求めることができます。
#include <stdio.h> #define N 100 void main(){ // Nまでの数の素数を表示する。 int i,m,n; int data[N + 1], result[N + 1]; // 配列の要素に1を入れる。 for (i = 0; i < N+1; i++){ data[i] = 1; } // 0と1は、最初から除外する data[0] = 0; data[1] = 0; m = 2; n = 0; do{ // 素数の倍数をリストから削除する for (i = 2 * m; i < N + 1; i+=m){ data[i] = 0; } // 結果を格納 result[n] = m; n++; // 次の素数候補を見つける do{ m++; }while (data[m] == 0 && m < N + 1); } while (m < N + 1); // 結果の出力 for (i = 0; i < n; i++){ // 10行ごとに改行 printf("%3d ", result[i]); if ((i+1) % 10 == 0){ printf("¥n"); } } printf("¥n"); }
プログラムを実行すると、コンソールから、二回せいすうのあたいを入力するように求めてきます。入力すると、その数値の最大公約数が表示されます。
実行結果
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97