《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之一(Luhn算法解释)

一、题面(文字版)

(金融:信用卡号合法性)使用"字符串"输入作为一个信用卡号来改写编程题6.29

原6.29(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式:一个信用卡号必须是13位到16位的整数,它的开头必须是:

  • 4是指"Visa"卡
  • 5是指"Master"卡
  • 37是指American Express卡
  • 6是指Discover卡
    在1954年,IBM的Hans Luhn提出一种算法,该算法可以验证信用卡号的有效性。这个算法在验证信用卡号是否有效或者信用卡是否被扫描仪正确扫描方面是非常有用的。遵循这种合法性检测,可以生成所有的信用卡卡号,通常称为Luhn检测或者Mod10检测。

1.1 Luhn算法介绍

它可以如下描述(为了方便解释,假设卡号为4388576018402626):
1)从左到右对每个数字翻倍。如果对某个数字翻倍后的结果是两位数,那么就将这两位加在一起得到一个一位数。
例:4388576018402626(从后面数,==书里写的方向是错的==。应该是从右往左数),见下表

从右数位置 原卡号字符 算式 结果 处理后
1 6 - - 6(偶数位,直接加)
2 2 2 × 2 4 4(奇数位,翻倍后加)
3 6 - - 6(偶数位,直接加)
4 2 1 × 2 2 2(奇数位,翻倍后加)
5 0 - - 0(偶数位,直接加)
6 4 4 × 2 8 2(奇数位,翻倍后加)
7 8 - - 8(偶数位,直接加)
8 1 1 × 2 2 2(奇数位,翻倍后加)
9 0 - - 0(偶数位,直接加)
10 6 6 × 2 12 1+2=3(奇数位,翻倍后加)
11 7 - - 7(偶数位,直接加)
12 5 1 × 2 10 1+0=1(奇数位,翻倍后加)
13 8 - - 8(偶数位,直接加)
14 8 8 × 2 16 1+6=7(奇数位,翻倍后加)
15 3 - - 3(偶数位,直接加)
16 4 4 × 2 8 8(奇数位,翻倍后加)

2)将表中的结果进行相加 4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

3)将偶数位进行相加 6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

4)将2步和3步加到一起 37 + 38 = 75

5)第4步的结果能被10整除,为合法,否则是非法

小技巧:Luhn算法简化解释

其实"翻倍后两位数相加" 可简化为 "减 9"(比如 12→1+2=3=12-9,16→1+6=7=16-9)

翻倍后若为两位数,直接减 9 等价于 "各位相加"(如 12-9=3,16-9=7),

*** 我们在代码中可直接用doubled - 9,无需判断位数。

1.2不合法卡号

python 复制代码
cardStr= "4388576018402626"
originalNumber = 75  # 4388576018402626得到的结果
lenStrNum = len(cardStr)

# 利用取余%功能
remainderAfterDivision = originalNumber % 10 #取余公式
# 三行输出结果
print(f"用户提供卡号{cardStr},进行计算结果如下:")
print(f"求余 {originalNumber} % 10 = {remainderAfterDivision}")
print(f"因此{lenStrNum}位的{cardStr}不是合法的卡号")

书里说的合法卡号,438857601840707结果除于也不对

例:438857601840707(使用方法参考上面的内容),见下表

奇数字符的字符串index 算式 结果 两位数则各位相加
7 index= 14 7 × 2 14 1 + 4 = 5
7 index = 12 7 × 2 14 1 + 4 = 5
4 index = 10 4 × 2 8
1 index = 8 1 × 2 2
6 index= 6 6 × 2 12 1+2=3
5 index =4 5 × 2 10 1+0=0
8 index=2 8 × 2 16 1+6=7
4 index=0 4 × 2 8

2)将表中的结果进行相加 5 + 5 + 8 + 2 + 3 + 1 + 7 + 8 = 39

3)将偶数位进行相加 0 + 0 + 8 + 0 + 7 + 8 + 3 = 26

4)将2步和3步加到一起 39 + 26 = 65

65除于也是余5,没法被整除呀。我做了修改

将438857601840707 改成438852601840707

在偶数位进行相加 0 + 0 + 8 + 0 + 2 + 8 + 3 = 21

39+21=60 ,60能被整除

1.3 根据题面进行的底层逻辑代码设计

python 复制代码
# 底层逻辑
cardStr1= "4388576018402626"
cardStr2= "438857601840707"
cardStr3= "438852601840707"
originalNumber1 = 75  #4388576018402626得到的结果
originalNumber2 = 65  #438857601840707得到的结果
originalNumber3 = 60  #4388526018402626得到的结果
lenStrNum1 = len(cardStr1)
lenStrNum2 = len(cardStr2)
lenStrNum3 = len(cardStr3)

# 利用取余%功能
remainderAfterDivision1 = originalNumber1 % 10 #取余公式
remainderAfterDivision2 = originalNumber2 % 10 #取余公式
remainderAfterDivision3 = originalNumber3 % 10 #取余公式

# 4388576018402626输出结果
print(f"用户提供卡号{cardStr1},进行计算结果如下:")
print(f"求余 {originalNumber1} % 10 = {remainderAfterDivision1}")
print(f"因此{lenStrNum1}位的{cardStr1}不是合法的卡号")


# 438857601840707输出结果
print(f"用户提供卡号{cardStr2},进行计算结果如下:")
print(f"求余 {originalNumber2} % 10 = {remainderAfterDivision2}")
print(f"因此{lenStrNum2}位的{cardStr2}不是合法的卡号")


# 438852601840707输出结果
print(f"用户提供卡号{cardStr3},进行计算结果如下:")
print(f"求余 {originalNumber3} % 10 = {remainderAfterDivision3}")
print(f"因此{lenStrNum3}位的{cardStr3}是合法的卡号")
相关推荐
2601_956319884 小时前
2026年零基础学量化:从看懂示例到写清条件和动作
人工智能·python
数智化管理手记4 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
过期的秋刀鱼!4 小时前
LangChain-D1-模型的工作流程
人工智能·python·langchain
萤火工厂目视化设计4 小时前
智能制造与企业文化目视化浪潮下:中小工厂的机遇与挑战
python·制造
cfm_29144 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统5 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
DeepVisionary5 小时前
从GPT-5.6 Sol的Ultrafast模式看推理速度竞赛:750 token/秒背后,Cerebras的晶圆级生意
python·自动化
阿pin6 小时前
Android随笔-kotlin withContext
android·kotlin·withcontext
leisoo80976 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
0x536 小时前
Java网络编程(二)
java·服务器·网络