题目
Code
-法1(这个代码有点走一步看一步的feel)
a = input()
sum = 0
j = 1
for i in range(12):
if a[i] != '-':
sum += int(a[i]) * j
j += 1
c = sum % 11
c = 'X' if c == 10 else str(c)
if c == a[12]:
print("Right")
else:
a = a[:12] + c
print(a)
代码解析
用一个循环遍历输入的字符,当是数字的时候就乘,然后相加,再取模得到识别码。先对c=10特殊情况进行分析,再按题目情况用if判断。关键是输入不要整体上转化成数字,这样后续操作才方便。
-法2(感觉设计的很好)
#0-670-82162-4
p1,p2,p3,p4=input().split("-")#0 670 82162 4
tmp=list(map(int,list(p1+p2+p3)))
rst=sum(tmp[i]*(i+1) for i in range(len(tmp)))%11
if rst==10:
rst='X'
else:
rst=str(rst)
if p4==rst:
print("Right")
else:
print(p1+"-"+p2+"-"+p3+"-"+rst)
代码解析
这是一道校验身份证号码的题目,校验的方法是使用每一位数字乘以对应的权重,将结果相加,对11取模,如果结果是10则校验位用“X”表示,否则用对应的数字表示。
具体解析如下:
- 首先,输入身份证号码,并将其分为四个部分,分别为区域码、出生日期码、顺序码和校验码。
- 将区域码、出生日期码和顺序码拼接成一个列表
tmp
,并将每个元素转换为整数类型。 - 对于列表
tmp
中的每个元素,计算其乘以对应的权重(即下标加1),并将结果相加,结果记为rst
。 - 对
rst
进行对11取模的操作,如果余数为10,则校验位为“X”,否则校验位为余数对应的数字。 - 最后,将校验位与输入的校验码比较,如果相等则输出“Right”,否则将输入的校验码替换为正确的校验码,并输出结果。
解题思路
先把输入处理一下计算最后一位,再判断对不对
奇技淫巧
- Q:ISBN号码中间有
-
,并且需要计算除去最后一位的数乘对应位置,该怎么处理输入?
–>p1,p2,p3,p4=input().split("-") tmp=list(map(int,list(p1+p2+p3)))
个人感觉处理的很好,
- 先用split用
-
分开四个部分分别存储到变量里; - 然后把前面需要用于计算的p1-p3变成int的列表;
(利用字符可加性拼起来–>转化成列表–>因为int(只能是字符串)再利用map
把字符串列表转化成int列表–>便后面的遍历乘数)
- Q;有特殊情况的处理与输出的顺序关系,怎么设计比较好?
–>首先是特殊情况处理,就是当算出结果等于10的时候,要转化成"X",这个时候先对计算结果进行分类,不用管输入的ISBN号码对不对;第一个if-else还可以把计算结果转化成字符,便于后续操作。