鱼C论坛

 找回密码
 立即注册
查看: 1829|回复: 1

[已解决]信用卡号码

[复制链接]
发表于 2023-3-29 23:28:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我们知道信用卡的号码非常长,但是仔细研究会其中也有规律,例如信用卡号码有一个内置的“数学关系”。



对于这个“数学关系”,大多数信用卡都使用IBM的Hans-Peter Luhn发明算法。根据Luhn的算法,我们可以确定信用卡号是否有效。方法如下

(1)   从倒数第二个数字开始,每隔一个数字乘以2;然后将得到的所有乘积的各个数位相加(注意不是乘积本身相加),得到结果sum1;

(2)   对于在(1)中没有乘上2的数字,直接相加得到结果sum2;

(3)   把(1)的结果和(2)的结果相加,即sum3=sum1+sum2。若sum3的最后一位数字是0,则信用卡号码有效。



例如有一个号码是4003600000000014,在第一步中,我们把标红色的数字乘以2然后相加,得到

1*2+0*2+0*2+0*2+0*2+6*2+0*2+4*2 = 2+12+8



将所得的所有乘积的各个数位相加,得到

sum1 = 2+1+2+8 = 13



在第二步中,我们把标黑色的数字直接相加,得到

sum2 = 4+0+0+0+0+0+3+0 = 7





最后第三步sum3 = sum1+sum2 = 20,因为20的最后一位是0,那么这个信用卡卡号是有效的。



本题检查输入信用卡号码cardNum是否有效。


输入

输入信用卡号码


输出

输入信用卡号码cardNum是否有效(True or False)




输入样例1
4003600000000014
输出样例1
True
最佳答案
2023-3-29 23:29:55
以下是Python代码实现:
def check_credit_card(cardNum):
    # 将字符串转换为数字列表
    nums = [int(x) for x in cardNum]

    # 从倒数第二个数字开始,每隔一个数字乘以2,得到所有乘积的各个数位之和
    sum1 = sum([int(x) for x in str(sum([num * 2 if i % 2 == 0 else num for i, num in enumerate(nums[-2::-1])]))])

    # 对于没有乘上2的数字,直接相加
    sum2 = sum([num for i, num in enumerate(nums[-1::-2])])

    # 将两部分的结果相加
    sum3 = sum1 + sum2

    # 判断结果是否为10的倍数
    return sum3 % 10 == 0

cardNum = input()
print(check_credit_card(cardNum))


解释:

首先将输入的信用卡号码转换为数字列表,然后根据 Luhn 算法计算出 sum1 和 sum2,最后将两部分结果相加得到 sum3,判断 sum3 是否为 10 的倍数即可。

注意,乘以 2 后的数字可能会有两位数,例如 6*2=12,因此在计算 sum1 时需要将得到的乘积的各个数位相加。可以使用 str() 将乘积转换为字符串,然后使用列表推导式将各个数位转换为数字并相加。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-29 23:29:55 | 显示全部楼层    本楼为最佳答案   
以下是Python代码实现:
def check_credit_card(cardNum):
    # 将字符串转换为数字列表
    nums = [int(x) for x in cardNum]

    # 从倒数第二个数字开始,每隔一个数字乘以2,得到所有乘积的各个数位之和
    sum1 = sum([int(x) for x in str(sum([num * 2 if i % 2 == 0 else num for i, num in enumerate(nums[-2::-1])]))])

    # 对于没有乘上2的数字,直接相加
    sum2 = sum([num for i, num in enumerate(nums[-1::-2])])

    # 将两部分的结果相加
    sum3 = sum1 + sum2

    # 判断结果是否为10的倍数
    return sum3 % 10 == 0

cardNum = input()
print(check_credit_card(cardNum))


解释:

首先将输入的信用卡号码转换为数字列表,然后根据 Luhn 算法计算出 sum1 和 sum2,最后将两部分结果相加得到 sum3,判断 sum3 是否为 10 的倍数即可。

注意,乘以 2 后的数字可能会有两位数,例如 6*2=12,因此在计算 sum1 时需要将得到的乘积的各个数位相加。可以使用 str() 将乘积转换为字符串,然后使用列表推导式将各个数位转换为数字并相加。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 21:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表