- ベストアンサー
C言語<素数を求めるプログラム>
#include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「int prime(int n)」内についてですが、 if(n < 2) return 0; →2未満の数字は素数としない、つまり「1」の時は素数ではないと判断したい処理ですね if(n == 2) return 1; →2の時は無条件に素数と判断する為です if(n%2 == 0) return 0; →nを2で割った時のあまりが0だったら素数ではない、つまり(2より大きい)偶数の時は絶対素数ではないので偶数をはぶく為の処理ですね for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } →割る数(i)を3から5、7、9・・・のように増やしていって、nを割ったときのあまりが0かどうか判断しています。 例:n=9場合、i=3の時に9/3であまりが0になるので、9は3で割り切れるから9は素数じゃない! の処理をしています。 return 1; →で、最後のreturnですが、これは説明不要でしょか? ここに来るまで素数じゃないと判断されたらreturn 0で途中で処理を抜けています。 つまりここまで来たら素数なのでreturn 1を返します。 で、よろしいでしょうか?
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・morigann さんへ。 >初期値不定のまま、いきなり「j++」してしまうと計算結果が無茶苦茶になる可能性あります。 ↑ j はグローバル変数なので初期化されますよ。つまり 0 です。 ・gigab3476 さんへ。 なぜ、j 変数はグローバル変数にしているのですか? 特に他の関数などで参照しないのであれば j は main() 関数内で宣言(初期化)しておきましょう。 int main( void ) { int j = 0; ←初期化 int n; : printf( "素数の個数は全部で %d 件見つかりました。\n", j ); return 0; } ・以上。
お礼
なるほど。そうなんですか。 丁寧なご指摘有難うございます。
- morigann
- ベストアンサー率17% (57/329)
余談ですが#2の追記です。 jが初期化されてないので、int main(void)のFor文に入る前に0で初期化しておくべきです。 初期値不定のまま、いきなり「j++」してしまうと計算結果が無茶苦茶になる可能性あります。
- php504
- ベストアンサー率42% (926/2160)
試し割りの素数判定法ですね nが素数かどうかを判定するのに3から√nまでの整数で順番に試しに割ってみて割り切れたら素数ではないという方法です。
お礼
大変わかりやすい回答有難うございました。 こちらと致しましても、なんかわかりそうな気がしました。 return 1;が素数の処理で、return 0;が素数でない処理なのですね。