《python语言程序设计》2018第6章第29题 财务应用程序:信用卡号的合法性 16位可以识别,不识别15位

1111

我没有按这个题里所要求的顺序和名称,

不是说题里写的不对,我觉得应该是按自己的想法来进行

题里说的是每个奇数进行相互乘然后结果相加便成了37

然后所有的偶数直接相加38

可是《python语言程序设计》在第7章和第8章以后才开始涉及到我们的列表和元祖。

为此我很苦恼

1 .进行原始的整除和除于 但是16位数。我不能进行1000000000000000这么长度运算

2.如何把vis_txt做成序列 但是都不成功

3.我做了一种尝试,就是利用第五章循环的for in visa卡

python 复制代码
# 我想利用这个方式遍历visa_text变量
visa_text = "4388576018402626"
for i in visa_text:
  print(i,i*2)
  

但是for循环不能进行整数间的这样的遍历,因此没有变成字符串是无法实现我的想法的。

最后只能将visa_text变成字符串

结果如下

那么我换成int呢,我增加了一个代码

python 复制代码
# 我想利用这个方式遍历visa_text变量
visa_text = "4388576018402626"
for i in visa_text:
  print(i,int(i)*2)
  

想解决跳着进行识别。奇数偶数

我找到了之前做过的代码

python 复制代码
调用了第一次做完的代码,
 def n_odd(number):
    a = number // 1000
    a_m = a * 2
    c = number % 1000 // 10 % 10
    c_m = c * 2
    if a_m >= 10 and c_m <= 9:
        odd_a_1 = a_m // 10
        odd_a_2 = a_m % 10
        odd_a_sum = odd_a_1 + odd_a_2
        return odd_a_sum + c_m
    elif c_m >= 10 and a_m <= 9:
        odd_c_1 = c_m // 10
        odd_c_2 = c_m % 10
        odd_c_sum = odd_c_1 + odd_c_2
        return odd_c_sum + a_m

    elif a_m >= 10 and c_m >= 10:
        odd_a_1 = a_m // 10
        odd_a_2 = a_m % 10
        odd_a_sum = odd_a_1 + odd_a_2
        odd_c_1 = c_m // 10
        odd_c_2 = c_m % 10
        odd_c_sum = odd_c_1 + odd_c_2
        return odd_c_sum + odd_a_sum
    elif a_m <= 9 and c_m <= 9:
        return a_m + c_m


def n_even(number):
    b = number % 1000 // 100
    d = number % 10
    return b + d


def isValid(n1, n2, n3, n4, a, b):
    c = a + b
    d = c % 10
    if 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 = 4388
    number2 = 5760
    number3 = 1840
    number4 = 2626  # 2001是valid
    a = 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位数的分别

我做出了新的改变

python 复制代码
 current_a1 = vis_n // 10000

我得到了438857601840

接下来我又根据整出1000和除于1000来进行分割。

根本不合法,后来我发现少一位。而我设计的是16位的,

438857601840707

算了!

大家就按16位来用吧。16位是可以的

vis_txt = 4388576018402626 #不合法

vis_txt = 4383576018402626 #合法

这个代码大家可以看一下。输入的时候可以将16位分成4段4位来进行的。这是我当时能想到的最好办法。我希望能超越这个。通过上一个公式,似乎给了我一些新的灵感。既然我们没法进行大规模的整除,那我先用10000 将这个16位的数字拆分成4段。类似我们之前求小时、分、秒的方法

python 复制代码
# vis_txt = 4388576018402626
# vis_txt = 4383576018402626
# vis_txt = 438857601840707


# 为测试数字的顺序刻意用的
# vis_txt = 4388576018402876


# 简单分割数据的函数,利用10000整除和除于来将16位代码分割
# 但是该函数还要改成可以分开奇、偶数
# 偶数
def splitTheDataEven(vis_n):
    current_a1 = vis_n // 10000
    a_t1 = vis_n % 10000
    # print("1th", a_t1)

    a_t2 = current_a1 % 10000
    # print("2th", a_t2)

    current_a3 = current_a1 // 10000
    a_t3 = current_a3 % 10000
    # print("3th", a_t3)

    a_t4 = current_a3 // 10000
    # print("4th", a_t4)

    even1 = a_t1 % 10
    even2 = a_t1 // 100 % 10

    even3 = a_t2 % 10
    even4 = a_t2 // 100 % 10

    even5 = a_t3 % 10
    even6 = a_t3 // 100 % 10

    even7 = a_t4 % 10
    even8 = a_t4 // 100 % 10

    return even1, even2, even3, even4, even5, even6, even7, even8


# 奇数
def splitTheDataOdd(vis_n):
    current_a1 = vis_n // 10000
    a_t1 = vis_n % 10000
    # print("1th", a_t1)

    a_t2 = current_a1 % 10000
    # print("2th", a_t2)

    current_a3 = current_a1 // 10000
    a_t3 = current_a3 % 10000
    # print("3th", a_t3)

    a_t4 = current_a3 // 10000
    # print("4th", a_t4)

    odd1 = a_t1 // 10 % 10
    odd2 = a_t1 // 100 // 10
    #
    odd3 = a_t2 // 10 % 10
    odd4 = a_t2 // 100 // 10
    #
    odd5 = a_t3 // 10 % 10
    odd6 = a_t3 // 100 // 10
    #
    odd7 = a_t4 // 10 % 10
    odd8 = a_t4 // 100 // 10

    return odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8


def mult_numOdd(int_num, m_num):
    a = int_num * m_num
    if a >= 10:
        div_a1 = a // 10
        div_a2 = a % 10
        return div_a1 + div_a2
    elif a == 0:
        return a
    else:
        return a


def oddAdd(visa_txt):
    a_text = splitTheDataOdd(visa_txt)
    temp_text = 0
    for i in a_text:
        temp_text += mult_numOdd(i, 2)
    return temp_text


def evenAdd(visa_txt):
    even_text = splitTheDataEven(visa_txt)
    temp_text = 0
    for i in even_text:
        temp_text += i
    return 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)
相关推荐
飞飞-躺着更舒服2 分钟前
【QT】实现电子飞行显示器(改进版)
开发语言·qt
武昌库里写JAVA17 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
c++------------------函数
开发语言·c++
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc2 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法