我們平常用的信用卡卡號
其實都符合一個叫做 Luhn mod-10 checksum 的簡單原則
你可以用這個 checksum 來判斷某個卡號是否合法
我們以底下的實例來解釋它的運作方式
假設輸入的卡號是 4503700080001232
從最右邊開始算起
奇數位的數字不變
只把偶數位的數目字乘以 2 存起來
所以 4 5 0 3 7 0 0 0 8 0 0 0 1 2 3 2
就變成了 8 5 0 3 14 0 0 0 16 0 0 0 2 2 6 2
乘以 2 之後如果大於 9 (變成了二位數)
就把兩個位數相加變成一位數
例如 14 就變成 1+4 = 5
所以 4 5 0 3 7 0 0 0 8 0 0 0 1 2 3 2
就變成了 8 5 0 3 14 0 0 0 16 0 0 0 2 2 6 2
再變成 8 5 0 3 5 0 0 0 7 0 0 0 2 2 6 2
最後把數字都加起來 然後判斷個位數字是否是 0
如果個位數是 0 就表示合法
如果個位數不是 0 就表示是不合法的卡號
由於 8+5+0+3+5+0+0+0+7+0+0+0+2+2+6+2 = 40
所以當初輸入的 4503700080001232 是合法的卡號
這次的作業題目:請寫出程式來判斷使用者輸入的卡號是否合法
[提示]
底下的程式碼可以讀取使用者輸入的卡號
char card_no[17];
int i;
scanf("%16s", card_no);
for (i=0; i<16; i++) {
card_no = card_no - '0'; /*從 ASCII 字元轉換成數值 */
}
最左邊的位數會儲存在 card_no[0] 的位置
最右邊的位數會儲存在 card_no[15] 的位置
接下來只要結合 for 迴圈、if 條件判斷、以及用 % 運算求餘數就可以寫出來
大概只要再多 10~15 行程式碼
歡迎光臨 亞寶論壇 (http://bbs.ahpal.com/) | Powered by Discuz! 7.0.0 |