[C言語]:エラトスティンのふるい
1868 ワード
エラトステネスのふるいのアルゴリズムを学ぶには、不可欠な部分がエラトネスのふるいです.ふるいのように数を濾過するので「エラトスティンのふるい」と呼ばれます. ノダ城が立ち並んでいますが、特定の範囲内を判定する少数の人には効率的です. まず1から100までの数字を書きます. 小数を除いても、合成数の唯一の自然数1ではありません. 2以外の2の倍数を除去します. 3以外の3の倍数を除去します. 5の倍数は削除する必要はありません.(2の倍数から削除します.) 2、3を除いて、残りの最小の少数、5の倍数を除去しなければならない. は、最後に7以外の7の倍数を除去する. 例を見てください.
もし1から300の小数を求めたら、どうしますか.
<フルコード>11^2>120なので、少量の排水を拭くだけで十分です.すなわち、120以下の数では、2、3、5、7の倍数を除いて、残りの数は少数である. コアコードは2つあります.
<コード1> i=2からずっと回転->
2(i) x 3(j)
2(i) x 4(j)
2(i) x 5(j)
2(i)x 6(j)等自身以外のiの倍数を除く.(1で示す) <コード2> a[i]=0の場合、そのインデックス値が出力されます.
もし1から300の小数を求めたら、どうしますか.
<フルコード>
#include <stdio.h>
#include <math.h>
#define SIZE 120
int main(void)
{
int a[SIZE] = { 0 }; // 0 ~ 300
int i, j;
for (i = 2; i <= sqrt(SIZE); i++) { // 최대값의 제곱근까지 반복
if (a[i] == 0) {
for (j = 2; i * j < SIZE; j++) { // 자신을 제외한 i의 배수 제거
a[i * j] = 1;
}
}
}
for (i = 2; i < SIZE; i++) {
if (a[i] == 0) printf("%d\n", i);
}
return 0;
}
<コード1>
for (i = 2; i <= sqrt(SIZE); i++) { // 최대값의 제곱근까지 반복
if (a[i] == 0) {
for (j = 2; i * j < SIZE; j++) { // 자신을 제외한 i의 배수 제거
a[i * j] = 1;
}
}
}
a[i]=0の場合、2(i) x 3(j)
2(i) x 4(j)
2(i) x 5(j)
2(i)x 6(j)等自身以外のiの倍数を除く.(1で示す)
for (i = 2; i < SIZE; i++) {
if (a[i] == 0) printf("%d\n", i);
}
return 0;
}
Reference
この問題について([C言語]:エラトスティンのふるい), 我々は、より多くの情報をここで見つけました https://velog.io/@qlwb7187/C언어-에라토스테네스의-체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol