質問 |
||
| 質問者:PHYOPHYO | for文の条件式について | |
|---|---|---|
困り度:
|
#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はどういう使われ方をするのか理解できません。どなたかご教授ねがいます。 |
|
質問投稿日時:08/04/08 10:12 質問番号:3931657 |
||
回答 |
|
| 回答者:masa6272 | エラトステネスの篩(ふるい)は、一定の数までの素数を効率よく求める方法の1つです。まず、プログラム云々より、この仕組みを理解してください。 そうすれば、どうしてこんなプログラムになるか分かるはずです。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/04/08 16:22 回答番号:No.4 |
|
| 参考URL: | http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E... |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| 回答者:auty | ・ 最初、全ての数を素数に設定して、約平方根までチェックし、 素数でないもの除いていきます。 ・ それぞれのiについての処理は、その倍数は素数にはなれませんのですべてFALSEに決定します。そのときの、iの倍数を順に求めるのが j+=i です。つまり for(j=i*2;j<=N;j+=i) で、自分を除くすべてのiの倍数を処理しているわけです。 なお、その前の if(is_prime[i]) は、既にiにFALSEがあるということは、その倍数についてもFALSEとして処理されている事が保障されていますから、無駄なチェックを省いているわけですね。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/04/08 11:21 回答番号:No.3 |
|
| この回答へのお礼 | for(j*2;j<=N;j+=i)の条件式がiの倍数を処理している事が良く分かり、納得しました。有難うございました。 |
回答 |
|
| 回答者:xkuonx | j+=iはj=j+iと同じ意味です。 また、for文の第一引数(この場合j=i*2)が実行されるのは for文のループが始まる最初だけです。 |
|---|---|
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| |
回答日時:08/04/08 10:20 回答番号:No.2 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| 回答者:koko_u_ | j には i の倍数が順々に格納されるので、 何かの数の倍数になっていれば素数ではないということだと思います。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/08 10:18 回答番号:No.1 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |