ページ 11

素数を…

Posted: 2011年5月01日(日) 21:07
by first
10000の素数を求めるというプログラムでこのようなプログラムを見つけたのですがわからないところがあったので教えていただけませんか?

#include <stdio.h>

int main(void)
{
int i,j,yakusuu;

for(i=1;i<=10000;i++)
{
yakusuu=0;
for(j=1;j<=i;j++)
{
if(i%j==0) yakusuu++;
}

if(yakusuu==2) printf("%d ",i);
}

printf("\n");

return 0;
}
なんですが

for(j=1;j<=i;j++)
{
if(i%j==0) yakusuu++;
}

↑ ↑ ↑ ↑ ↑
上のfor文の意味がわかりません
できるだけくわしく教えていただけないでしょうか
よろしくお願いします

Re: 素数を…

Posted: 2011年5月01日(日) 21:22
by box
first さんが書きました:10000の素数を求める
10000「まで」の素数、ですね。
first さんが書きました:

コード:

for(j=1;j<=i;j++)
		{
			if(i%j==0) yakusuu++;
		}
変数 i は、素数かどうかを判定したい数が入っています。
変数 j は、i の約数候補です。
i が j で割り切れたら、j が i の約数であることがわかるので、約数の個数(変数 yakusuu)を1増やします。

Re: 素数を…

Posted: 2011年5月01日(日) 21:25
by みけCAT
「1からiまでの整数を一つづつ調べ、
iがその数で割り切れたら(その数がiの約数だったら)変数yakusuuを1増やす」
という意味です。
これによりiの約数の数が数えられます。

※コードはコードタグで囲みましょう

Re: 素数を…

Posted: 2011年5月02日(月) 11:16
by first
box さんが書きました:
first さんが書きました:10000の素数を求める
10000「まで」の素数、ですね。
first さんが書きました:

コード:

for(j=1;j<=i;j++)
		{
			if(i%j==0) yakusuu++;
		}
変数 i は、素数かどうかを判定したい数が入っています。
変数 j は、i の約数候補です。
i が j で割り切れたら、j が i の約数であることがわかるので、約数の個数(変数 yakusuu)を1増やします。
ありがとうございます

Re: 素数を…

Posted: 2011年5月02日(月) 11:16
by first
みけCAT さんが書きました:「1からiまでの整数を一つづつ調べ、
iがその数で割り切れたら(その数がiの約数だったら)変数yakusuuを1増やす」
という意味です。
これによりiの約数の数が数えられます。

※コードはコードタグで囲みましょう
ありがとうございます

Re: 素数を…

Posted: 2011年5月02日(月) 15:37
by non
解決したのかも知れませんが、途中で素数でないことがわかっても、最後まで割っていくのはあまりにも無駄です。
考え方を変えて、2からi-1まで順に割っていき、割り切れたときには非素数なので、内側のループから抜けるようにしてはどうでしょうか。

Re: 素数を…

Posted: 2011年5月02日(月) 21:54
by box
それを言っちゃうと、「2からi-1まで順に割っていく」という方法もそれなりに非効率ですね。

Re: 素数を…

Posted: 2011年5月04日(水) 20:15
by non
box さんが書きました:それを言っちゃうと、「2からi-1まで順に割っていく」という方法もそれなりに非効率ですね。
ルートi まででいいのですが、説明が面倒なので。
もっと良くするなら、求めた素数を配列に格納して、その素数だけで割っていくのでしょうが。