《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 // 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位数的分别

我做出了新的改变

 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 // 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)

在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电饭叔

谢谢各位兄弟们的关注,谢谢破费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值