# 20191205 基礎班 --- ## 本次講義皆為課後新增 --- ## 課程大綱 1. 作業檢討 2. 再談 Function 3. 淺談 Array 4. 淺談加密 --- ## 課程影片 ---- ### 阿滴英文 阿滴突襲 Google 台灣辦公室! {%youtube ES73LXd4LGg %} --- ## 本週作業 ![](https://i.imgur.com/fAOUkSt.jpg =x400) 信用卡 ---- ### 信用卡 tl;dr 使用 Luhn 演算法驗證信用卡卡號。 範例: ``` Number: 4003600000000014 VISA ``` ---- ### 作業詳細說明 ---- 你應該有看過信用卡,信用卡有一串數字,他會被印在塑膠卡面上,並儲存在卡片的晶片或磁條中。 同時這個數字也儲存在某個地方的資料庫中,這樣當你拿著這張卡消費的時候,債權人就知道是誰付的款。 ---- 世界上很多人有信用卡,所以這些數字很長: * American Express 使用 15 位數 * MasterCard 使用 16 位數 * Visa 使用 13 或 16 位數 ---- 而這些都是 10 進位數字, 所以理論上 American Express 可以發行 $10^{15}$ = 1,000,000,000,000,000 張卡! ---- 其實並沒有那麼浮誇,因為卡號是有規則的: * American Express 卡號的開頭都是 34 或 37 * MasterCard 卡號的開頭介於 51 到 55 間 * Visa 卡號的開頭都是 4 ---- 同時,卡號也都有校驗碼(checksum), 透過這種機制,我們可以不用跟資料庫連線,就能簡單驗證卡號(在語法上)是否有效。 ---- 那麼,怎麼檢驗卡號呢? 大多數卡號都是採用 IBM 研究員 Hans Peter Luhn 發明的演算法: 0. 從數字的倒數第二位開始,由右而左, 偶數位乘以二,並把個位數與十位數相加。 1. 將該總和加到奇數位的和中 2. 如果加起來的總和尾數為零 (也就是除以十餘零),則該卡號有效! ---- 聽起來有點複雜, 我們舉個++小明++的 VISA 卡號的例子: 4003600000000014 ---- 先把倒數第二位開始的所有偶數位標出 ==4== 0 ==0== 3 ==6== 0 ==0== 0 ==0== 0 ==0== 0 ==0== 0 ==1== 4 ---- 然後把每個標出來的偶數位數字乘以二 ==1==`*2` ==0==`*2` ==0==`*2` ==0==`*2` ==0==`*2` ==6==`*2` ==0==`*2` ==4==`*2` ---- 於是我們得到 2、0、0、0、0、++12++、0、8 ---- 接者把十位數跟個位數加總,變成 2 + 0 + 0 + 0 + 0 + ++1 + 2++ + 0 + 8 = ==13== ---- 然後把 13 跟卡號其他位數加起來 ==13== + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20 ---- 是的,我們得到的數字總和尾數是 0, ++小明++的卡片是合法的! ---- 其實驗證卡號並不難吧? 但是步驟真的有點繁瑣,我們把它寫成程式吧! ---- ### 作業規範 1 輸入一個卡號,驗證他是以下哪種情況? * American Express * MasterCard * Visa * 無效卡號 ---- ### 作業規範 2 為簡單起見,您可以假定使用者輸入的都是數字(不含連接號) ---- ### 作業規範 3 請使用 `long long` 型態宣告, 取得使用者輸入的卡號, 而不是 `int`(想想看為什麼?) ```cpp long long number; cin >> number; ``` ---- ### 測試資料 1 | 發行單位 | 卡號範例 | | ---------------- | ---------------- | | American Express | 378282246310005 | | American Express | 371449635398431 | | American Express | 378734493671000 | ---- ### 測試資料 2 | 發行單位 | 卡號範例 | | ---------------- | ---------------- | | MasterCard | 5555555555554444 | | MasterCard | 5105105105105100 | ---- ### 測試資料 3 | 發行單位 | 卡號範例 | | ---------------- | ---------------- | | Visa | 4111111111111111 | | Visa | 4012888888881881 | | Visa | 4222222222222 | ---- ### 作業繳交連結 https://classroom.github.com/a/95PjOjO1
{"metaMigratedAt":"2023-06-15T02:15:27.911Z","metaMigratedFrom":"YAML","title":"20191205 基礎班","breaks":true,"slideOptions":"{\"transition\":\"convex\"}","contributors":"[{\"id\":\"39811bc9-1305-4534-84c5-a4c97d2ac539\",\"add\":2505,\"del\":76}]"}
    833 views
   owned this note