#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)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?
No.2ベストアンサー
- 回答日時:
「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を返します。
で、よろしいでしょうか?
大変わかりやすい回答有難うございました。
こちらと致しましても、なんかわかりそうな気がしました。
return 1;が素数の処理で、return 0;が素数でない処理なのですね。
No.4
- 回答日時:
★アドバイス
・morigann さんへ。
>初期値不定のまま、いきなり「j++」してしまうと計算結果が無茶苦茶になる可能性あります。
↑
j はグローバル変数なので初期化されますよ。つまり 0 です。
・gigab3476 さんへ。
なぜ、j 変数はグローバル変数にしているのですか?
特に他の関数などで参照しないのであれば j は main() 関数内で宣言(初期化)しておきましょう。
int main( void )
{
int j = 0; ←初期化
int n;
:
printf( "素数の個数は全部で %d 件見つかりました。\n", j );
return 0;
}
・以上。
No.3
- 回答日時:
余談ですが#2の追記です。
jが初期化されてないので、int main(void)のFor文に入る前に0で初期化しておくべきです。
初期値不定のまま、いきなり「j++」してしまうと計算結果が無茶苦茶になる可能性あります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
比較回数と交換回数表示について
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 配列と関数の練習問題
-
c言語
-
std::set<int> で、ある値が何...
-
卒業研究でよく分からないとこ...
-
C言語 エラーの原因がわからな...
-
DLLをGetProcAddress()で実行で...
-
【C++】関数ポインタの使い方
-
read関数をノンブロッキングで...
-
C言語における対称行列の作り方...
-
構造体の勉強中です 合計点の高...
-
C言語です。
-
C言語での引数の省略方法
-
困ってます…nCrを求めるC言語...
-
C++でvectorにテキストファイル...
-
プログラミング
-
素数 再帰関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報