SWUST 派森练习题:P117. isbn判别

描述

ISBN是国际标准书号的简称,10位ISBN的最后一位为校验位(由前9位计算得到),校验方法为,前9位数字从左到右,分别与10到2相乘,然后求和,得到的和再对11进行整除,得到余数(即对11进行取模运算),再用11减去余数即为校验位。如果结果为10用X表示,结果为11用0表示。例如,对7111267768​​进行ISBN校验位的运算,前9位为711126776。​​7*10+1*9+1*8+1*7+2*6+6*5+7*4+7*3+6*2​​,和为​​197​​,​​197%11​​为​​10​​,​​11-10​​为​​1​​,即上述ISBN用10位ISBN表示应该为​​7111267761​​。

编写程序,输入一个10位ISBN书号,判断是否为有效ISBN号,若是,输出有效,若不是,输出无效,并输出正确校验码的ISBN号。

样例

输入1

7-309-04547-5

输出1

正确

输入2

7-115-54608-1

输出2

不正确

正确的应该是7115546088

代码:

b = input()
a = list(b)
he = int(a[0])*10+int(a[2])*9+int(a[3])*8+int(a[4])*7+int(a[6])*6+int(a[7])*5+int(a[8])*4+int(a[9])*3+int(a[10])*2
he = 11-(he % 11)
if int(a[12]) == he:
    print("正确")
else:
    out = b[0]+b[2]+b[3]+b[4]+b[6]+b[7]+b[8]+b[9]+b[10]+str(he)
    print("不正确")
    print("正确的应该是", end='')
    print(out)

代码描述:

b = input()
  • 这行代码使用input()函数从用户获取一个13位的ISBN号,并将其赋值给变量b
a = list(b)
  • 这行代码将字符串b转换成列表形式,将每个字符分别存储在列表a中。
he = int(a[0])*10+int(a[2])*9+int(a[3])*8+int(a[4])*7+int(a[6])*6+int(a[7])*5+int(a[8])*4+int(a[9])*3+int(a[10])*2
  • 这行代码计算校验和(checksum),即将ISBN号的前12位按照固定权重相乘并求和。
  • 权重的计算方式为:第1位乘以10,第3位乘以9,第4位乘以8,第5位乘以7,第7位乘以6,第8位乘以5,第9位乘以4,第10位乘以3,第11位乘以2。
  • 将乘积相加的结果保存在变量he中。
he = 11-(he % 11)
  • 这行代码计算校验和的取余结果与11的差值,得到校验码。
  • 如果校验和的余数为0~10之间的数字,用11减去余数得到校验码;如果余数为11,则校验码为0。
if int(a[12]) == he:
    print("正确")
else:
    out = b[0]+b[2]+b[3]+b[4]+b[6]+b[7]+b[8]+b[9]+b[10]+str(he)
    print("不正确")
    print("正确的应该是", end='')
    print(out)
  • 这部分代码比较输入的ISBN号的最后一位与校验码是否相等。
  • 如果相等,则输出"正确";否则,将正确的校验码拼接到原始的ISBN号上,并输出"不正确"以及正确的ISBN号。
  • 拼接正确的ISBN号时,将原始的ISBN号中的第13位替换为校验码,结果存储在变量out中。

猜你喜欢

转载自blog.csdn.net/m0_63501513/article/details/132397355