返回列表 回復 發帖

[討論] [C語言]清大資工程式設計作業七解答

[討論] [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 行程式碼
班上同學提供的解答,我稍微整理以下而已
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5.    
  6.     char card_no[17];
  7.     int i, sum = 0;
  8.    
  9.     printf("Please enter your credit card number : \n");
  10.     scanf("%16s", card_no);                     //只能容下16位 不包含/0
  11.     for (i = 0; i < 16; i++)
  12.     {
  13.         
  14.         card_no[i] = card_no[i] - '0';        //由ASCII轉成數值
  15.         
  16.         if(i%2 == 0)
  17.             card_no[i] = card_no[i]*2;
  18.             
  19.         if(card_no[i] > 9)
  20.             card_no[i] = (int)(card_no[i]/10) + (card_no[i]%10);
  21.                     
  22.         sum += card_no[i];
  23.     }
  24.    
  25.     for(i = 0; i < 16; i++)
  26.     {
  27.           printf("%d ", card_no[i]);
  28.     }
  29.    
  30.     printf("%d", sum);
  31.    
  32.     if(sum%10 == 0)
  33.         printf("Avlid");
  34.         
  35.     else
  36.         printf("Inavlid");

  37.     return 0;
  38. }
複製代碼
返回列表