【python基础刷题--6.ISBN号码】

题目

ISBN号码题目链接
在这里插入图片描述

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”,否则将输入的校验码替换为正确的校验码,并输出结果。

解题思路

先把输入处理一下计算最后一位,再判断对不对

奇技淫巧

  1. Q:ISBN号码中间有-,并且需要计算除去最后一位的数乘对应位置,该怎么处理输入?
    –>p1,p2,p3,p4=input().split("-") tmp=list(map(int,list(p1+p2+p3)))个人感觉处理的很好,
  • 先用split用-分开四个部分分别存储到变量里;
  • 然后把前面需要用于计算的p1-p3变成int的列表;
    (利用字符可加性拼起来–>转化成列表–>因为int(只能是字符串)再利用map把字符串列表转化成int列表–>便后面的遍历乘数)
    在这里插入图片描述
  1. Q;有特殊情况的处理与输出的顺序关系,怎么设计比较好?
    –>首先是特殊情况处理,就是当算出结果等于10的时候,要转化成"X",这个时候先对计算结果进行分类,不用管输入的ISBN号码对不对;第一个if-else还可以把计算结果转化成字符,便于后续操作。
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值