Luhn

Luhn

中等

簡介

在 Global Verification Authority,你剛被交付了一項關鍵任務。從線上購物到安全登入,這座城市裡數不清的操作,都仰賴信用卡號碼、銀行帳號、交易代碼和追蹤編號這類數值識別碼的正確性。Luhn 演算法是一種簡單的校驗碼公式,用來協助辨識輸入錯誤的號碼。

剛才有一批識別碼送到你的桌上。它們全都必須通過 Luhn 測試,才能確認是合法的。只要有任一項沒通過,就會被標記為無效,藉此避免像是交易錯誤或帳戶驗證失敗這類問題。

你能確保這件事正確完成嗎?許多服務的完整性都取決於你喔。

說明

判斷一個數字是否符合 Luhn 公式。

數字會以字串的形式提供。

驗證數字

長度為 1 或更短的字串不合法。 輸入中可以包含空格,但在檢查之前應該先把它們去掉。 其他所有非數字字元都不允許。

範例

有效的信用卡號

要檢查的號碼是 4539 3195 0343 6467。

Luhn 演算法的第一步,是從號碼的尾端開始,從右邊數來第二個數字起往左走,每隔一個數字就把它加倍。

4539 3195 0343 6467
↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)

如果某個數字加倍後的結果大於 9,就從結果中減去 9。 最後會得到:

8569 6195 0383 3437

最後,把所有數字相加。 如果總和能被 10 整除,原本的號碼就是有效的。

8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80

80 能被 10 整除,所以號碼 4539 3195 0343 6467 是有效的!

無效的加拿大 SIN

要檢查的號碼是 066 123 478。

我們從號碼的尾端開始,從右邊數來第二個數字起往左走,每隔一個數字就把它加倍。

066 123 478
 ↑  ↑ ↑  ↑  (double these)

如果某個數字加倍後的結果大於 9,就從結果中減去 9。 最後會得到:

036 226 458

我們把數字相加:

0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36

36 不能被 10 整除,所以號碼 066 123 478 不是有效的!

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Rust Exercism

準備好開始 Luhn 了嗎?

註冊 Exercism,透過 99 個練習 和真人引導來學習並精通 Rust,全部免費。

深入探索 Luhn!

我們會探索 8 種不同版本的 Luhn,從一個非常簡潔的 Ruby 實作開始,接著看看一些指令式與函式風格的做法,最後來到一個讓 Erik 和 Jeremy 花了一番功夫才解讀出來的 SQLite 版本!