《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)
相关推荐
捕鲸叉6 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer10 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq12 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
阡之尘埃40 分钟前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山2 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程2 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
观音山保我别报错2 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小屁孩大帅-杨一凡3 小时前
java后端请求想接收多个对象入参的数据
java·开发语言