close
Content
這些日子以來,使用信用卡在網路上購買東西已經變的司空見慣。
但是因為信用卡卡號比較長,很容易在輸入他們的時候打錯。
為了快速的識別錯誤,如數字打錯,大多數的電子商務網站都會用一種校檢演算法來確認信用卡卡號
 
一種較為流行的校檢演算法叫做 "Luhn"演算法 (Luhn algorithm),它可以檢測任何一位元的錯誤及多位元錯誤:
 
1.從倒數第二個位元開始,將他們放到後面,並且加倍其他沒有移動的位元到另一個列表
2.把列表內的數字的位元加總(n),再把被移到後面的數字加總(m),在把兩個數加起來 (n+m)
3.如果這個數字的結尾是0,則信用卡卡號為合法的,反之則是不合法的。
 
這裡有個例子,以這組號碼為例 5181 2710 9900 0012:
 
1.把相對應的數字加倍後,放到另一個列表 (5 181 271 990 0012) :10,16,4,2,18,0,0,2。
 
2.把這些數的位元加起來得到 (1+0) + (1+6) + 4 + 2 + (1+8) + 0 + 0 + 2=25
  沒有對應到的位元合為1+1+7+0+9+0+0+2 = 20 , 所以最後的總和是 20 + 25 = 45。
 
3. 45不是以0結尾,故這組信用卡號並不合法。
 
 
 
對於這個問題,你需要寫一個根據 Luhn演算法的程式來確認輸入的信用卡號是否合法。
Input

輸入的第一行為N 代表接下來有幾組測試資料

之後的N行

每行包含一行信用卡號碼

每個信用卡號碼由16個 10進位位數字組成四組,並且以空白分隔

Output

 輸出包含一行文字

如果號碼是合法的,請輸出"Valid"

如果不合法,請輸出"Invalid" 

Sample Input #1
2
5181 2710 9900 0012
5181 2710 9900 0017
Sample Output #1
Invalid
Valid

Python:

from sys import stdin

def fn(x):
    od={"0":0,"1":2,"2":4,"3":6,"4":8,"5":1,"6":3,"7":5,"8":7,"9":9}
    ev={"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
    b1=sum([od[c]  for c in x[0::2]])
    c1=sum([ev[c]  for c in x[1::2]])
    return (b1+c1)%10

ns={}
for i in range(10000):
    t= str(i).zfill(4)
    #在每一個元素都排成四位數樣式,沒到前面補0
    # zfill() 方法返回指定长度的「字符串」,原字符串右对齐,前面填充0。
    ns[t]=fn(t)
    #出現{'0002':2}

n=int(stdin.readline())
for _ in range(n):
    s=stdin.readline().strip().split()
    v= sum([ns[x] for x in s])%10
    if v==0:
        print("Valid")
    else:
        print("Invalid")

 

 

 

 

arrow
arrow
    文章標籤
    python 高中生程式解題
    全站熱搜
    創作者介紹
    創作者 趴趴熊日常 的頭像
    趴趴熊日常

    資工趴趴熊的小天地

    趴趴熊日常 發表在 痞客邦 留言(0) 人氣()