C - 数が素数であるかどうかを判断する
質問
私は整数を受け取り、その数が素数かどうかをブール値で返すメソッドを考え出そうとしています。
基本的にはC#でこのようにします。
static bool IsPrime(int number)
{
for (int i = 2; i < number; i++)
{
if (number % i == 0 && i != number)
return false;
}
return true;
}
どのように解決するのですか?
では、Cのことは忘れて、ある数字を与えて、それが素数かどうか判断してもらうとします。 あなたはどのようにそれを行うのですか? その手順を明確に書き出してください。 では コードに変換することを心配する。
アルゴリズムが決まれば、プログラムの書き方を考えるのも、他の人に手伝ってもらうのも、ずっと楽になります。
を編集してください。 投稿されたC#のコードです。
static bool IsPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0 && i != number) return false;
}
return true;
}
これは
ほぼ
はそのまま有効な C 言語です。
bool
型はありませんし
true
または
false
というように、少し修正する必要があります (編集: Kristopher Johnson は、C99 が stdbool.h ヘッダを追加したことを正しく指摘しています)。 C99環境にアクセスできない人もいるので(でも使うべきです!)、その非常に小さな変更を行いましょう。
int IsPrime(int number) {
int i;
for (i=2; i<number; i++) {
if (number % i == 0 && i != number) return 0;
}
return 1;
}
これは、あなたが望むことを行う完全に有効なCプログラムです。 あまり労力をかけずに、少し改良することができます。 まず、以下の点に注意してください。
i
は常に
number
というチェックが入るので
i != number
は常に成功するため、これを取り除くことができます。
までの約数を実際に試す必要はありません。
number - 1
までの約数を試す必要はなく、sqrt(number)に到達した時点でチェックを止めることができます。 というのも
sqrt
は浮動小数点演算であり、微妙な点が山ほどあるため、ここでは実際に
sqrt(number)
. そのかわり
i*i <= number
:
int IsPrime(int number) {
int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
最後にもう一つ、あなたのオリジナルのアルゴリズムには小さなバグがありました。 もし
number
が負、0、または 1 の場合、この関数はその数が素数であると主張します。 あなたはそれを適切に処理したいと思うでしょうし、そのために
number
を符号なしとしたいと思うかもしれません。
int IsPrime(unsigned int number) {
if (number <= 1) return 0; // zero and one are not prime
unsigned int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
これは数字が素数かどうかをチェックする最速の方法ではないことは確かですが、動作しますし、とても簡単です。 私たちはあなたのコードをほとんど変更する必要がありませんでした。
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 素数かどうかを判断するのに、なぜ平方根まで確認するのか?
-
[解決済み] C#の配列に単一の値を入力/インスタンス化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 関数を終了するには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015