《python语言程序设计》2018第6章第29题 财务应用程序:信用卡号的合法性 16位可以识别,不识别15位
1111
我没有按这个题里所要求的顺序和名称,
不是说题里写的不对,我觉得应该是按自己的想法来进行
题里说的是每个奇数进行相互乘然后结果相加便成了37
然后所有的偶数直接相加38
可是《python语言程序设计》在第7章和第8章以后才开始涉及到我们的列表和元祖。
为此我很苦恼
1 .进行原始的整除和除于 但是16位数。我不能进行1000000000000000这么长度运算
2.如何把vis_txt做成序列 但是都不成功
3.我做了一种尝试,就是利用第五章循环的for in visa卡
# 我想利用这个方式遍历visa_text变量
visa_text = "4388576018402626"
for i in visa_text:print(i,i*2)
但是for循环不能进行整数间的这样的遍历,因此没有变成字符串是无法实现我的想法的。
最后只能将visa_text变成字符串
结果如下
那么我换成int呢,我增加了一个代码
# 我想利用这个方式遍历visa_text变量
visa_text = "4388576018402626"
for i in visa_text:print(i,int(i)*2)
想解决跳着进行识别。奇数偶数
我找到了之前做过的代码
调用了第一次做完的代码,def n_odd(number):a = number // 1000a_m = a * 2c = number % 1000 // 10 % 10c_m = c * 2if a_m >= 10 and c_m <= 9:odd_a_1 = a_m // 10odd_a_2 = a_m % 10odd_a_sum = odd_a_1 + odd_a_2return odd_a_sum + c_melif c_m >= 10 and a_m <= 9:odd_c_1 = c_m // 10odd_c_2 = c_m % 10odd_c_sum = odd_c_1 + odd_c_2return odd_c_sum + a_melif a_m >= 10 and c_m >= 10:odd_a_1 = a_m // 10odd_a_2 = a_m % 10odd_a_sum = odd_a_1 + odd_a_2odd_c_1 = c_m // 10odd_c_2 = c_m % 10odd_c_sum = odd_c_1 + odd_c_2return odd_c_sum + odd_a_sumelif a_m <= 9 and c_m <= 9:return a_m + c_mdef n_even(number):b = number % 1000 // 100d = number % 10return b + ddef isValid(n1, n2, n3, n4, a, b):c = a + bd = c % 10if d == 0:print(f"This {str(n1)} {str(n2)} {str(n3)} {str(n4)} credit card is valid")print(d)print(c)else:print(f"This {str(n1)} {str(n2)} {str(n3)} {str(n4)} credit card is invalid")print(d)print(c)def main():# number1 = eval(input("Input credit card number: "))# number2 = eval(input("Input credit card number: "))# number3 = eval(input("Input credit card number: "))# number4 = eval(input("Input credit card number: "))number1 = 4388number2 = 5760number3 = 1840number4 = 2626 # 2001是valida = n_odd(number1) + n_odd(number2) + n_odd(number3) + n_odd(number4)b = n_even(number1) + n_even(number2) + n_even(number3) + n_even(number4)isValid(number1, number2, number3, number4, a, b)main()
在这里我们看到了,我是将16位进行了分割。
我觉得还是应该进行4位数4位数的分别
我做出了新的改变
current_a1 = vis_n // 10000
我得到了438857601840
接下来我又根据整出1000和除于1000来进行分割。
根本不合法,后来我发现少一位。而我设计的是16位的,
438857601840707
算了!
大家就按16位来用吧。16位是可以的
vis_txt = 4388576018402626 #不合法
vis_txt = 4383576018402626 #合法
这个代码大家可以看一下。输入的时候可以将16位分成4段4位来进行的。这是我当时能想到的最好办法。我希望能超越这个。通过上一个公式,似乎给了我一些新的灵感。既然我们没法进行大规模的整除,那我先用10000 将这个16位的数字拆分成4段。类似我们之前求小时、分、秒的方法
# vis_txt = 4388576018402626
# vis_txt = 4383576018402626
# vis_txt = 438857601840707# 为测试数字的顺序刻意用的
# vis_txt = 4388576018402876# 简单分割数据的函数,利用10000整除和除于来将16位代码分割
# 但是该函数还要改成可以分开奇、偶数
# 偶数
def splitTheDataEven(vis_n):current_a1 = vis_n // 10000a_t1 = vis_n % 10000# print("1th", a_t1)a_t2 = current_a1 % 10000# print("2th", a_t2)current_a3 = current_a1 // 10000a_t3 = current_a3 % 10000# print("3th", a_t3)a_t4 = current_a3 // 10000# print("4th", a_t4)even1 = a_t1 % 10even2 = a_t1 // 100 % 10even3 = a_t2 % 10even4 = a_t2 // 100 % 10even5 = a_t3 % 10even6 = a_t3 // 100 % 10even7 = a_t4 % 10even8 = a_t4 // 100 % 10return even1, even2, even3, even4, even5, even6, even7, even8# 奇数
def splitTheDataOdd(vis_n):current_a1 = vis_n // 10000a_t1 = vis_n % 10000# print("1th", a_t1)a_t2 = current_a1 % 10000# print("2th", a_t2)current_a3 = current_a1 // 10000a_t3 = current_a3 % 10000# print("3th", a_t3)a_t4 = current_a3 // 10000# print("4th", a_t4)odd1 = a_t1 // 10 % 10odd2 = a_t1 // 100 // 10#odd3 = a_t2 // 10 % 10odd4 = a_t2 // 100 // 10#odd5 = a_t3 // 10 % 10odd6 = a_t3 // 100 // 10#odd7 = a_t4 // 10 % 10odd8 = a_t4 // 100 // 10return odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8def mult_numOdd(int_num, m_num):a = int_num * m_numif a >= 10:div_a1 = a // 10div_a2 = a % 10return div_a1 + div_a2elif a == 0:return aelse:return adef oddAdd(visa_txt):a_text = splitTheDataOdd(visa_txt)temp_text = 0for i in a_text:temp_text += mult_numOdd(i, 2)return temp_textdef evenAdd(visa_txt):even_text = splitTheDataEven(visa_txt)temp_text = 0for i in even_text:temp_text += ireturn temp_text# print(oddAdd(vis_txt))
# print(evenAdd(vis_txt))def isValid(visa_text):a = oddAdd(visa_text) + evenAdd(visa_text)if a % 10 == 0:print(f"This visa code {visa_text} is valid!")else:print(f"This visa code {visa_text} is not valid!")print("Sorry! again input, or call worker!")print(a)isValid(vis_txt)