質數的判斷 題目: ![](https://i.imgur.com/eYbLNjV.jpg) 看了質數的定義:在大於1的正整數中,除了1和此整數自己以外,無法被其他正整數整除的數 花了一點時間分析了一下質數定義延伸出來的特性,也就是說: 1.假設N=5是質數的話,那麼從2開始,2,3,4,到5,只有一個數字5,會跟N自己相等 2.除了2是質數之外,其他所有偶數都不是質數,用這判斷條件來加速程式迴圈判斷時間 另外,郭大您之前有提點,建議用int.TryParse判斷輸入的字串轉整數 以下是程式練習時的思路過程記錄: 第一版 ````C# static void Main(string[] args) { Console.WriteLine("請輸入一個大於等於2的正整數:"); int.TryParse(Console.ReadLine(), out int num); int i = 2; if (num >= 2) { while (i < num) { if (num % i == 0) { Console.WriteLine($"{num}不是質數"); break; } i++; } if (i == num) { Console.WriteLine($"{num}是質數"); } } else { Console.WriteLine("輸入的字,不是大於等於2的正整數"); } } ```` 快速完成可以跑的第一版後,再來進行基本的程式優化 先把程式做函數化 第二版 ````C# static void Main(string[] args) { Console.WriteLine("請輸入一個大於等於2的正整數:"); IsPrime(Console.ReadLine()); } static void IsPrime(string consoleInputString) { int.TryParse(consoleInputString, out int num); int i = 2; if (num >= 2) { while (i < num) { if (num % i == 0) { Console.WriteLine($"{num}不是質數"); break; } i++; } if (i == num) { Console.WriteLine($"{num}是質數"); } } else { Console.WriteLine("輸入的字,不是大於等於2的正整數"); } } ```` 看一下這IsPrime()函式內,還做了: 1.判斷輸入字串是否能轉成整數 2.質數判斷 3.輸出的內容字串 再優化,把IsPrime()函式的功能單純化,函式單純判斷質數就好,把可能會變化的1跟3移出去 第三版 ````C# static void Main(string[] args) { string result = ""; Console.WriteLine("請輸入一個大於等於2的正整數:"); bool isTrue = int.TryParse(Console.ReadLine(), out int num); if (isTrue && num>=2) { result = IsPrime(num) ? $"{num}是質數" : $"{num}不是質數"; } else { result = "輸入的字,不是大於等於2的正整數"; } Console.WriteLine(result); } static bool IsPrime(int number) { int i = 2; { while (i < number) { if (number % i == 0) { return false; } i++; } return (i == number); } } } ```` 最後,綜合第二版與第三版的優點,重點在讓Main()段落程式碼更好 第四版 ````C# static void Main(string[] args) { Console.WriteLine("請輸入一個大於等於2的正整數:"); IsPrime(Console.ReadLine()); } static void IsPrime(string consoleInputString) { bool isTrue = int.TryParse(consoleInputString, out int num); string result; if (isTrue && num >= 2) { result = IsPrime(num) ? $"{num}是質數" : $"{num}不是質數"; } else { result = "輸入的字,不是大於等於2的正整數"; } Console.WriteLine(result); } static bool IsPrime(int number) { int i = 2; { while (i < number) { if (number % i == 0) { return false; } i++; } return (i == number); } } ```` 以上是小弟我目前新手程度能想到,依照郭大您的題意,寫一支判斷質數的function,大概測一下時間,從分析題意(約10分鐘),到逐步四個版本思考如何優化與測試(每一版平均差不多15-20分鐘),到最終版本程式碼,整個差不多要花近1個半小時。 因為有學完OOP,所以後續還有時間的話,我會再把這支質數程式,練習寫成Int類別的擴充方法,或是模擬一個抽數字情境,符合質數、奇數、偶數...等等多條件的委派,或是一個簡單的工廠模式等練習,到時候再麻煩郭大幫我看一下code,萬分感謝^^