|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
以下是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() 将乘积转换为字符串,然后使用列表推导式将各个数位转换为数字并相加。
|
|