約数の表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ロビンソン

約数の表示について

#1

投稿記事 by ロビンソン » 9年前

どうも、こんにちは。
現在、独習Cで勉強しているものです。
さて、83ページの練習3.6の問題で質問があります。
問題は、「2~1000までの素数を見つけて、表示せよ。」というもので、
答えは、

コード:

 
#include <stdio.h>

int main(void)

{
	int i,j,prime;
	
	for(i=2;i<1000;i++){
		prime = 1;
		for(j=2;j<=(i/2);j++)
			if(!(i%j))
			prime = 0;
		if (prime)
			printf("%dは素数です\n",i);
	}
	return 0;
}

となっております。
コードですが、まず外側のfor文で、2から1000までインクリメントしつつ、
内側のfor文で、素数を見つけていると思うのですが、
primeが1のとき、真となり、そのときは、素数判定とし、
primeが0のときは、偽となり、そのときは、表示しないかと思います。
ただ、if(!(i%j))の意味がよくわかりません。
たとえば、iが11だったとします。
すると、2<=11/2、3<=11/2、4<=11/2、5<=11/2、
いずれも、条件を満たすと思います。
そうすると、%の結果も、それぞれ、1,2,3,1となると思いますが、
このあと、if(!(i%j))、prime = 0;の処理をしている意味がどうしてもわかりませんでした。
おそらく、素数判定をしているのだと思うのですが、漠然としていて、お手上げでした。

ご回答いただければ、ありがたいです。
よろしくお願いします。

アバター
MNS
記事: 35
登録日時: 9年前

Re: 約数の表示について

#2

投稿記事 by MNS » 9年前

if文はif(条件)で、条件が真のとき真文(if文の直後の処理)を行います。
Cでは真≠0、偽=0と決まっています(というのは理解しているようですね)

if(!条件)で、!は否定を行う論理演算子なので、
こんどは逆に、条件=0のとき→真、条件≠0のとき→偽となります。

>%の結果も、それぞれ、1,2,3,1となる
のように、1、2、3、1は≠0なので、偽となり、
{ prime = 0; }の処理は実行されません。
ゆえにprimeは1=真のままなので、素数であると出力されます。


分かりやすく言えば、
if(!(i%j)) → if(!(i%j!=0)) → if(i%j==0) のことであり、
余りが0であれば素数でないからprimeを0にする、
という処理を行っているんだと思います。

ロビンソン

Re: 約数の表示について

#3

投稿記事 by ロビンソン » 9年前

MNS様、回答ありがとうございます。

よく理解できました。
if(!(i%j))より、if(i%j==0)の方がわかりやすいかなと思います。
疑問が解消できてよかったです。
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る