当前位置:首页>python>Python编程题:28.P1055 [NOIP 2008 普及组] ISBN 号码

Python编程题:28.P1055 [NOIP 2008 普及组] ISBN 号码

  • 2026-09-02 17:21:40
Python编程题:28.P1055 [NOIP 2008 普及组] ISBN 号码

点击蓝字 关注我们

今天要做的是来自洛谷网站的P1055 [NOIP 2008 普及组] ISBN 号码。

https://www.luogu.com.cn/problem/P1055

有账号的可以上去做做。

P1055 [NOIP 2008 普及组] ISBN 号码

题目描述

每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。

ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以 1 加上次位数字乘以 2 ……以此类推,用所得的结果 mod11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。

例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162 这 9 个数字,从左至右,分别乘以 1,2,…,9 再求和,即 0×1+6×2+……+2×9=158,然后取 158mod11 的结果 4 作为识别码。

你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。

输入格式

一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。

输出格式

一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -)。  

输入输出样例

解题思路

识别码是根据ISBN码的数字通过特定计算方法得到的,所以要先获取每个数字的值。

然后计算求和,再除以11求余数。

特殊情况:余数为11,校验码为X

最后要求判断计算得来的校验码和用户输入时的ISBN码最后一位是否一样,来判断ISBN码是否合格。

做题步骤:

  • 读取整行字符串 isbn;

  • 构造无横杠版本:去掉所有'-',得到长度 10 的串 

  • 对前9位数字进行公式计算。得出验证码。

  • 计算余数 rem = sum % 11,算出标准正确校验码correct;

  • 判断 raw[9] == correct:

  • 成立:打印Right

  • 不成立:截取原字符串除最后一位以外部分 + correct,拼接输出

知识点

  • 字符输入 input() 获取字符串,。

  • 替换字符串中的字符:s.replace(字符1,字符2)

  • 求余数%

  • 获取字符串的片段:s[开始索引:结束索引]

    索引从0开始。结束索引不包括。

    例如截取第2-4个字符,s[1:4]。

参考代码及解析

方法一:

1、isbn = input().strip():读取输入完整 ISBN 字符串。

2、raw = isbn.replace('-', '')

把所有-删除,得到连续 10 位字符。

3、total = 0 :统计和

for i in range(9):    遍历前9个数字

digit = int(raw[i])    :转换为整数

total += digit * (i + 1):每个数字和权重相乘后计算和。

4、rem = total % 11:总和对 11 取余。

5、if rem == 10:    correct = 'X'

else:    correct = str(rem)

余数 10 对应校验码大写 X,其余转为字符串数字。

6、if raw[9] == correct:    print("Right")

raw [9] 是输入自带的最后一位校验码,比对正确值。

else: new_isbn = isbn[:-1] + correct    print(new_isbn)

isbn[:-1]取原字符串除最后一位的全部内容,拼接正确校验码形成标准 ISBN 输出。

方法二:

1、第2行:index代表每个数字要相乘的权值。

2、4-8行:直接对输入的ISBN码进行遍历字符,“-”不计算,其他字符转换为数字格式后进行计算,index+1,用于下次数字的计算。

3、第9行直接创建列表对应不同余数值所对应的数字,可以免去余数是否为10的判断。

4、第10行:用余数作为索引值,获取对应的字符和输入的ISBN进行比对。

最新文章

随机文章