# 20191205 基礎班
---
## 本次講義皆為課後新增
---
## 課程大綱
1. 作業檢討
2. 再談 Function
3. 淺談 Array
4. 淺談加密
---
## 課程影片
----
### 阿滴英文
阿滴突襲 Google 台灣辦公室!
{%youtube ES73LXd4LGg %}
---
## 本週作業

信用卡
----
### 信用卡 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}]"}