2015-11-14 44 views
1

所以基本上,我需要寫的LUHN算法的代碼,但我需要有至少5個功能需要幫助的代碼,所有的結果都回來了假,當2應該是真實的

我已經寫一個代碼來做到這一點,但我收到他們應該是真實的假結果。例如,我知道數據文件中的第二個和第四個數據片段對於此算法是正確的,但是我的所有輸出都是錯誤的。你能幫我弄清楚我出錯的地方嗎?

這是代碼:

def CheckLength(numb): 
    if len(numb)>12 and len(numb)<17: 
     return True 
    else: 
     return False 
def CheckType(numb): 
    if numb[0]=='4': 
     return 'Visa' 
    elif numb[0]=='5': 
     return 'MasterCard' 
    elif numb[0]=='6': 
     return 'Discover' 
    elif numb[0:2]=='37': 
     return 'American Express' 
    else: 
     return 'Invalid Entry' 
def Step1(numb): 
    total1=0 
    total2=0 
    length=len(numb) 
    for i in range(length-2,-1,-2): 
     double=eval(numb[i])*2 
     if double>9: 
      doublex=str(double) 
      doubleY=int(doublex[0])+int(doublex[1]) 
      total1+=doubleY 
     else: 
      total2+=double 
     total=total1+total2 
     return total   
def Step2(numb): 
    total=0 
    length=len(numb) 
    for i in range(length-1,-2,-2): 
     total+=i 
    return total 
def Step3(num1,num2): 
    total=num1+num2 
    if total%10==0: 
     return True 
    else: 
     return False 
def main(): 
    inFile=open('pa7.cards','r') 
    cardNum=inFile.readline().strip() 
    while cardNum!='99999': 
     step1=Step1(cardNum) 
     step2=Step2(cardNum) 
     step3=Step3(step1,step2) 
     print(step1) 
     print(step2) 
     print(step3) 
     cardNum=inFile.readline().strip() 
    inFile.close() 
main()  

這是數據文件:

4388576018402626 
4388576018410707 
37271983 
5190828258102121 
99999 

這是打印所有3個步驟

4 
63 
False 
0 
63 
False 
7 
15 
False 
4 
63 
False 
+0

'麻木了[0:1]'只給出了一個字符 - 它必須是'麻木[0 :2]' – furas

+0

哦,謝謝注意到,但輸出仍然都是錯誤的step3 – 52655841856

+0

添加更多'print()'看看你在變量中有什麼值 – furas

回答

4

當我得到的輸出(我評論作爲回答,包括來自@DavidZemens評論的建議和更正)

在錯誤的方面,我想你:

步驟1具有循環內的return聲明,所以循環只發生一次,然後停止。

def Step1(numb): 

    for i in range(length-2,-1,-2): 

     return total  
    ^--^-- move this left, to where 'for' is 

步驟2是增加了櫃檯,而不是信用卡數字,它是通過步進每隔數字而不是每個數字:

def Step2(numb): 
    total=0 
    length=len(numb) 

    for i in range(length-1,-1,-1): 
     total += int(numb[i]) 

    return total 

在通用代碼評論,這種測試:

if len(numb)>12 and len(numb)<17: 
    return True 
else: 
    return False 

有點多餘。 如果(真理測試)返回否則真返回False可以成爲回報(真理測試)

return 12 < len(numb) < 17 

及更高版本:

total = num1 + num2 
if total%10==0: 
    return True 
else: 
    return False 

可以是:

return (num1 + num2) % 10 == 0 

這個計算:

double=eval(numb[i])*2 
    if double>9: 
     doublex=str(double) 
     doubleY=int(doublex[0])+int(doublex[1]) 
     total1 += doubleY 

將數字轉換爲文本,將文本字符轉換爲數字,然後將它們相加,有點尷尬。

它能做什麼是以幾十號(10整數除法),其餘部分(模10),所以你可以跟上這一切的數字:

double = int(numb[i]) * 2 
if double > 9: 
    total1 += (double // 10) + (double % 10) 

eval()是不好的做法,它給任何輸入完全訪問Python解釋器沒有保障。在代碼中,你可以使用int()代替


你的文件循環可以更清楚:

def main(): 
    with open('pa7.cards') as inFile: 
     for cardNum in inFile: 
      cardNum = cardNum.strip() 
      step1=Step1(cardNum) 
      step2=Step2(cardNum) 
      step3=Step3(step1,step2) 
      print(step1) 
      print(step2) 
      print(step3) 

,你可能會被轉換cardnum中爲編號的列表,一旦得到一些利益,然後與之合作,而不是在全國各地撥打int()

您還可以優化兩個未使用的功能(假設你在代碼中的其他地方使用它們):

def CheckLength(numb): 
    return 12 < len(numb) < 17 

def CheckType(numb): 
    """ 
    returns the type of credit card, based on the first digit or 2 digits 
    numb; passed as string 
    """ 
    n = numb[0] if not numb[0] == '3' else numb[:1] 
    d = {4:'Visa', 
     5:'Mastercard', 
     6:'Discover', 
     37:'American Express'} 
    return d.get(int(n), 'Invalid Entry') 
+0

@DavidZemens - 在您的編輯中,CheckLength沒有檢查長度,在CheckType中,您將整個信用卡號碼轉換爲一個整數,並期望它以4,5,6或7出現,而不是測試第一個一個或兩個數字(我認爲這意味着它不能作爲一個字典查找)?這些看起來都不錯。 – TessellatingHeckler

+0

我的錯誤是,在開始研究這些函數之前,我發現他們甚至沒有用到代碼的其他部分,我認爲他們還沒有完成,但我做了一些額外的修改。 –