- UID
- 789
- 帖子
- 13
- 精華
- 7
- 積分
- 538
- 金幣
- 513
- 威望
- 17
- 推廣
- 0
- 閱讀權限
- 10
- 在線時間
- 14 小時
- 註冊時間
- 2007-10-21
|
1樓
發表於 2007-11-5 21:24
| 只看該作者
[討論] [C語言]清大資工程式設計作業七解答
題目我們平常用的信用卡卡號
其實都符合一個叫做 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 行程式碼 班上同學提供的解答,我稍微整理以下而已- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
-
- char card_no[17];
- int i, sum = 0;
-
- printf("Please enter your credit card number : \n");
- scanf("%16s", card_no); //只能容下16位 不包含/0
- for (i = 0; i < 16; i++)
- {
-
- card_no[i] = card_no[i] - '0'; //由ASCII轉成數值
-
- if(i%2 == 0)
- card_no[i] = card_no[i]*2;
-
- if(card_no[i] > 9)
- card_no[i] = (int)(card_no[i]/10) + (card_no[i]%10);
-
- sum += card_no[i];
- }
-
- for(i = 0; i < 16; i++)
- {
- printf("%d ", card_no[i]);
- }
-
- printf("%d", sum);
-
- if(sum%10 == 0)
- printf("Avlid");
-
- else
- printf("Inavlid");
- return 0;
- }
複製代碼
|
|