大家在學校都學過質數,所謂「質數」就是「一個大於1的正整數,除了1與本身之外,沒有其他的因數」,就稱為質數,最小的質數是2。

質數在網路時代有個很重要的應用,就是加密的通訊協定"HTTPS","HTTPS" 用在幾乎所有網站或App中,加密的原理就是先找尋兩個「非常大」的質數當作秘密鑰匙,通常要「數百位數」這麼大的質數,然後將這兩個大質數相乘的乘積傳出去,如果第三者想看到秘密,必須將乘積做因數分解,設法獲得那兩個大質數,但這會讓電腦花很長很長時間還無法解開。

所以質數可說是我們網路私密的守門員。我們就來設計一個簡單的程式,找出1000以內(三位數以下)的質數。

// 1-5b 尋找質數
// Created by Heman, 2020/07/08
func 是質數嗎(_ n: Int) -> Bool {
    if n < 2 {
        return false
    } else if n == 2 {
        return true
    }
    for i in 2...(n-1) {
        if (n % i) == 0 {
            return false
        }
    }
    return true
}

var 計數 = 0
let 上限 = 1000
for i in 1...上限 {
    if 是質數嗎(i) {
        計數 = 計數 + 1
        print("#\\(計數).", i)
    }
}
print("小於\\(上限)的質數一共\\(計數)個")

我們先寫一個函式「是質數嗎(n)」,用來判斷 n 是不是質數,若是則傳回 true,不是則傳回 false,所以函式回傳的類型是 Bool。

函式中,主要判斷質數的原理很簡單,就是試試看n 是否能被小於 n且大於等於2的數整除(即餘數為0)。

在這裡有個新的運算符號,百分比 % ,用來計算兩數相除的餘數,函式裡面:

 if (n % i) == 0 { }

其中 (n % i) == 0 就是指「n 除以 i 所得的餘數是否等於0」,也就是「n 能否被 i 整除」。記得前面提過,Swift 程式裡面,等號 = 是用來指定值給變數,若要判斷兩數是否相等,要用兩個等號 == 。

除了 == 之外,用來比較的邏輯運算符號包括 !=, <=, >=, <, >,這些邏輯運算符號同樣可以用在「字串」或其他類型的比較,以後遇到再說。

 a == b  a, b兩數是否相等
 a != b  a, b兩數是否不相等
 a <= b  a是否小於或等於b
 a >= b  a是否大於或等於b
 a < b   a是否小於b
 a > b   a是否大於b

有了「是質數嗎(n)」這個函式,尋找1000以下的質數就很簡單,用一個 for 迴圈即可。如果要找1百萬以下的質數,也只要程式修改「上限」值即可。

註解

  1. 目前(2021年)已知最大質數超過「2千萬位數」,不是2千萬喔,「2千萬位數」是1後面接2千萬個0。 https://en.wikipedia.org/wiki/Largest_known_prime_number