質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

4回答

2107閲覧

C言語 素数判定のコード、総当りを避ける方法

Kchan_01

総合スコア110

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/03/19 04:40

C言語でアルゴリズムを勉強しています。

下記のコードのアルゴリズムについて質問です。
while (i <= nb / i)の部分が理解できません。
なぜこの書き方で総当りを避けられるのでしょうか。
エラトステネスの篩を使った方法ならわかるのですが、なぜ下記の書き方ができるのか、根拠を知りたいです。
ご存知の方がいらっしゃいましたら、教えてください。

c

1int ft_is_prime(int nb) 2{ 3 int i; 4 5 i = 2; 6 if (nb <= 1) 7 return (0); 8 9 // ここ! 10 while (i <= nb / i) 11 { 12 if (nb % i == 0) 13 return (0); 14 i++; 15 } 16 return (1); 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

A = B * Cのように2つの数の積で表されるとしたら、片方は√A以下となります(√Aより大きなものを2つ掛ければ、Aを越えます)。

i <= nb / iを変形すると、i * i <= nbとなります。CPUの処理はわり算より掛け算のほうが早いので、i * i <= nbのまま使ったほうがいいでしょう。

投稿2020/03/19 04:50

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bearded-Ockham

2020/03/20 05:00

わざわざ割り算を使っているのは無限ループを避けるためだと思います。説明を簡単にするため、intが8ビットの符号付き整数だとします。例えばnbに127を与えると、i==11ではi*iは121なので次の繰り返しにいきまはすが、i==12だとi*iは144になり、8ビットの符号付では負数となってしまいます。
guest

0

こう書き直したらわかりませんか?

for(int i = 2; i * i <= nb; i++) if (nb % i == 0) return false; return true;

101が素数かどうかは10以下の数で割れるかだけ調べればいいんですね

余談ですが、素数判定、微々たる差だけど、こうすると1/3で判定が終わるんで好きですね

if (nb % 2 == 0) return false; if (nb % 3 == 0) return false; for(int i = 5; i * i <= nb; i += 6){ if (nb % i == 0) return false; if (nb % (i + 2) == 0) return false; } return true;

投稿2020/03/19 04:50

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2からnbの平方根までの総当たりをしています。
総当たりをしていないというのが勘違いでしょう。

コードの書き方から見て、かなり初心者の作ですね。

投稿2020/03/19 04:53

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何をもって,

総当りを避け

と言っているのかわかりませんが…
単に,

  • nb は 2の倍数か?
  • nb は 3の倍数か?
  • nb は 4の倍数か?
  • ...

というのをやっているだけに見えます.
で,これをどこまで続けねばならないか?を考えれば,そのwhileの条件になるという話でしょう.

投稿2020/03/19 04:48

編集2020/03/19 04:48
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問