プロが教えるわが家の防犯対策術!

C言語を学習していて「独習C」48ページの次のプログラムが分かりませんでした。

~~~~~~~~~~~~~~~~

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int num, i, is_prime;

printf("判定したい数を入力してください");
scanf("%d", &num);

/*ここからがわかりません*/
is_prime = 1;
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;

if(is_prime==1) printf("素数です");
else printf("素数ではありません");

return 0;
}

~~~~~~~~~~~~~~~
私はこうなると考えています。どこが間違っているでしょうか?
numが0のとき、2<=0となり、素数
numが1のとき、2<=0.5となり、素数でない
numが2のとき、2<=1となり、素数でない
numが3のとき、2<=1.5となり、素数でない

A 回答 (3件)

皆さんの言われている通りですが



例えばnum=7とするとiは2と3でif文を実行します。・・素数と判定
次にnum=8とするとiは2と3と4でif文を実行します。・・非素数と判定。

なお蛇足ですがさらに効率アップを考えれば
for(i=2; i<=sqr(num); i=i+1)
とするのが普通です。
    • good
    • 0
この回答へのお礼

さらなるステップアップへの助言ありがとうございます。今後の参考とさせていただきます。

お礼日時:2006/08/19 10:53

for(i=2; i<=num/2; i=i+1)


は入力した数/2になるまでiを+1しながらループするという意味です
(必要最小限回そうということで/2をしています)
ここでは素数かどうかは判断していません。

実際に素数かどうかを判断しているのは、
if((num%i)==0)
この部分で、で除算した時に余りがあるか無いかの判断になります
ループに入る前に
numが0のときis_prime = 1としておき、
除算した時に余りがあるか割る数を+1していきながらチェック
除算した時に余りがなければ(素数ではない)is_prime = 0となります

numが0~3のとき、ループは即抜け、is_prime = 1なので素数
    • good
    • 0
この回答へのお礼

よく分かりました。
2で割っているのがなんなのか分からず迷ってました。回答ありがとうございます。

お礼日時:2006/08/19 10:51

forは前判定なので、条件を満たしていないnum<4の場合は


if((num%i)==0)・・・
を実行しません。ので、is_primeは1のまま。ゆえに素数。
ただし、numのチェック(1以下、負数も含め素数とはしない)をしていないので不十分ですね。入力データに条件がないですか?
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
そうですね。for文の入門のソースですから
細かいことは省略しているみたいです。
ありがとうございました。

お礼日時:2006/08/18 10:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!