![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
素数を求める関数の作り方を調べていたら以下のような
プログラムを見つけました。
for文の中は奇数で割り切れるかどうかを調べているということで
いいのでしょうか??何故j*j<=kとなっているのでしょうか??
後、最後のreturn YES;はどのような場合実行されるのでしょうか??
#include<stdio.h>
#define YES 1
#define NO 0
int sosu(int k){
int j;
if(k == 2) return YES;
if(k % 2 == 0) return NO;
for(j=3;j*j<=k;j+=2){
if(k % j == 0) return NO;
}
return YES;
}
No.1ベストアンサー
- 回答日時:
int sosu(int k){ //実数kが素数かどうかを調べる関数
int j;
if(k == 2) return YES; //k=2ならば、kは素数である
if(k % 2 == 0) return NO; //kが偶数ならば、kは素数ではない
for(j=3;j*j<=k;j+=2){ //kが3以上の奇数のとき
if(k % j == 0) return NO; //k以外の奇数で割り切れれば、素数ではない
}
return YES; //上記の処理をくぐってくれば素数である
}
です。
y=SQRT(y)^2ですから、SQRT(y)以上の約数が出てくるはずがないんです。
ですから、それ以上の処理はしません。
No.4
- 回答日時:
> j*j<=kのところがよくわかりません。
k がいくつかの数の積であらわせるとき、そのうち少なくとも一つは√kより小さくなります。
そうでないと掛け合わせたときkを超えてしまいますから。
なので、kが何かで割り切れるか否かの判定は√kより小さな数について調べれば十分ってことです。
No.3
- 回答日時:
j*j<=kについて横から補足すると
j*j<=kという部分はkの平方根とjを比較する代わりにjの二乗とkを比較しているのです。
jとkがともに負でないとき、
j×j≦kであることとj≦√kであることは等価です。
No.2
- 回答日時:
「素数かどうか」の判定とは、要するに「その数を割ると余りが0になる数が存在しない」ことを確認すればいいわけです。
一つでも割り切れる数があったら、元の数は素数ではない。
で、割り切れるかどうかについては総当たりで調べるわけですが、小さい数から順に調べる場合、
・最初に2で割り切れるかどうか調べておけば、あとは奇数だけしらべれば良い
偶数で割り切れるような数は2でも割り切れますから「最初の2で割り切れるかどうかチェック」で非素数と判定済になってます。
・最大でも元の数の平方根まで調べればよい
平方根より大きい数で割り切れる場合、その商(=平方根より小さい)でも割り切れるので、小さい方の数での割り切れるかどうか判定で非素数と判定済となっているはず。
(例えば、15が素数かどうかチェックするとき、15=3×5ですが
「3で割り切れるかどうか」のチェックをした後なら「5で割り切れるかどうかのチェック」は要らない、ということです)
この回答への補足
皆さん回答ありがとうございます。
だいたい把握することができたのですがやはり
j*j<=kのところがよくわかりません。
引き続きよろしくお願いします。
お探しの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言語 プログラミング 4 2022/05/22 11:53
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
迷路を脱出する経路探索プログ...
-
C言語のプログラムについて(...
-
条件が多い場合
-
c言語プログラミングについて f...
-
OPEN
-
C++で表を作成したいのです ...
-
再起呼び出しの回数をカウント...
-
C言語で簡単なパックマンゲーム...
-
【C#】SQL文の中に変数を埋め込...
-
2の補数を計算するプログラム
-
Nは2以上とする。1からNまでの...
-
DXライブラリによるパズルゲー...
-
関数と引数の関係とは?
-
数値フラグの判定方法
-
関数とビット列
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
EXCELの分散分析表のP-値が....
-
fflush(stdin)の使い方とprintf...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報