本日の1日1問プログラミング学習枠です。
本企画ではChatGPTにお題を出題させ回答していきます。
〇お題
問題: 素数の判定プログラム 与えられた整数が素数であるかどうかを判定するプログラムを作成してみてください。素数は1と自分自身以外の約数を持たない整数です。プログラムは以下の要件を満たす必要があります: ユーザーから整数を入力として受け取ります。 入力された整数が素数であれば "素数です" と表示し、素数でなければ "素数ではありません" と表示します。 入力値が1以下の場合には "素数ではありません" と表示します。 この問題を解決するプログラムを作成し、異なる整数値に対してテストしてみてください。また、効率的な素数判定アルゴリズムを使用することがおすすめです。
定番ですね
〇筆者の回答
using System; public class Program { public static void Main() { int input = 1277837 ;//入力値 if(primeNum(input)) { Console.WriteLine(input +"は素数です。"); } else { Console.WriteLine(input + "は素数ではありません。"); } } public static bool primeNum(float input) { if(input % 2==0 )//偶数を排除 { if(input ==2) return true;//2は素数 return false; //2以外の2で割り切れる値は素数ではない } else { int result = 0; for(int i = 0 ; i < input/2 ; i++) { if(input % i == 0) { result += 1; } } if( result == 1)//1と自分自身でのみ割り切れた場合 return true; else return false; } } }
〇ChatGPTの評価
評価:
素数の判定ロジック: コードは与えられた整数が素数かどうかを判定しようとしています。偶数の排除と2の特別な処理、および割り算のループを用いています。
コードの処理: コードは基本的に動作しますが、一部の部分でエラーが発生する可能性があります。たとえば、ゼロで割り算を試みる問題があります。
改善点:
割り算のループ: ループ内で input % i の剰余を計算していますが、この部分でゼロで割り算が発生します。ループを開始する i の初期値が0ではなく、1から始める必要があります。また、ループの条件は i <= input / 2 ではなく i <= input / 2 です。
データ型: input は整数値として扱うべきです。したがって、float ではなく int を使用するべきです。
ループの最適化: 素数判定アルゴリズムを最適化することができます。例えば、ループを i <= Math.Sqrt(input) まで実行し、剰余計算を減らすことができます。
修正を加えたコードの一部を示します:
public static bool IsPrime(int input) { if (input <= 1) { return false; // 1以下の整数は素数ではない } if (input == 2) { return true; // 2は素数 } if (input % 2 == 0) { return false; // 偶数は素数ではない } for (int i = 3; i <= Math.Sqrt(input); i += 2) { if (input % i == 0) { return false; // 割り切れる場合は素数ではない } } return true; }
ChatGPTの改善ではfor文の条件式でMath.Sqrt(input)が使用され平方根で計算し、さらにi += 2と2以外の偶数は素数ではないので2の倍数で処理量を抑えています。
for文は(i =0; i < x ; i++)の基本形に慣れすぎてしまっていたのでもう少し頭を使いたいです。
本日は以上です。