描述
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
中。