---
# System prepended metadata

title: Untitled
tags: [C#, "\_質數"]

---

質數的判斷

題目：

![](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，萬分感謝^^

