#include<stdio.h>
#define N 30
#define TRUE 1
#define FALSE 0
char is_prime[N+1];
int main(void)
{
for(i=1;i<=N;i++){
is_prime[i]=TRUE;
}
is_prime[1]=FALSE
for(i=2;i*i<=N;i++)→(1)
if(is_prime[i])
for(j=i*2;j<=N;j+=i)→(2)
is_prime[j]=FALSE;→(3)
printf("%dまでの素数は、\n",N);
for(i=1;i<=N;i++)
if(is_prime[i])
printf("%d",i);
return 0;
これはエラトステネスの素数を求めるプログラムですが、(1)のi*iは2 3 5と理解できるんですが(2)の条件式が理解できません。
例えはi=2のときjは4になるのですが、(3)は is_prime[4]=FALSEとなりj+=iは6になりますが、何ゆえこれが増分として出てくるのか理解できません。
j+=iはどういう使われ方をするのか理解できません。どなたかご教授ねがいます。
No.3ベストアンサー
- 回答日時:
・ 最初、全ての数を素数に設定して、約平方根までチェックし、
素数でないもの除いていきます。
・ それぞれのiについての処理は、その倍数は素数にはなれませんのですべてFALSEに決定します。そのときの、iの倍数を順に求めるのが
j+=i
です。つまり
for(j=i*2;j<=N;j+=i)
で、自分を除くすべてのiの倍数を処理しているわけです。
なお、その前の
if(is_prime[i])
は、既にiにFALSEがあるということは、その倍数についてもFALSEとして処理されている事が保障されていますから、無駄なチェックを省いているわけですね。
No.4
- 回答日時:
エラトステネスの篩(ふるい)は、一定の数までの素数を効率よく求める方法の1つです。
まず、プログラム云々より、この仕組みを理解してください。そうすれば、どうしてこんなプログラムになるか分かるはずです。
参考URL:http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9% …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使って魔方陣
-
C言語の二分法のプログラムにつ...
-
構文エラー";"が型の前にあり...
-
初心者です。for文、if文を使っ...
-
for文の中にswitch文はいれられ...
-
C言語 数字以外を入力させない...
-
#if 1 #elseの意味について
-
scanf関数を用いての加減乗除%...
-
c言語の問題
-
配列を関数に渡す方法
-
C言語プログラムが理解できなくて…
-
VHDLで、case文とwhen文のどち...
-
getcの改行判定
-
C言語でfor文を用いたプログラ...
-
c言語プログラミングで1から100...
-
c言語のプログラムで
-
scanfが実行されません
-
直角三角形を表示するプログラム
-
C言語のプログラミング (基礎...
-
for文を使用して値を代入したい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
計算結果がlong型以上になる場...
-
プログラミングで二番目に大き...
-
scanf関数を用いての加減乗除%...
-
getcの改行判定
-
C言語で電卓を作成する。
-
配列を使って魔方陣
-
C言語で勉強中(max,min)の出し方
-
C言語階乗の総和を求める
-
VHDLで、case文とwhen文のどち...
-
C言語でのトランプシャッフルに...
-
プログラム
-
while文について、c言語...
-
OpenCVを用いて任意の時間で静...
-
scanfが実行されません
-
C言語 数字以外を入力させない...
-
C言語です
おすすめ情報