首页 > 试题广场 >

[NOIP2008]ISBN号码

[编程题][NOIP2008]ISBN号码
  • 热度指数:24559 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 50M,其他语言100M
  • 算法知识视频讲解
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。


输入描述:
只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。


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

输入

0-670-82162-4

输出

Right
示例2

输入

0-670-82162-0

输出

0-670-82162-4
num=list(input().split('-'))
n1=list(num[0]+num[1]+num[2])
j=1
sum=0
for i in n1:
    sum+=int(i)*j
    j+=1
m=sum%11
n=num[-1]
if m!=10 and n!='X' and m==int(n):
    print('Right')
elif m==10 and n=='X':
    print('Right')
elif m==10 and n!='X':
    print(str(num[0])+'-'+str(num[1])+'-'+str(num[2])+'-X')
elif m!=10 and n=='X':
    print(str(num[0])+'-'+str(num[1])+'-'+str(num[2])+'-'+str(m))
else:
    print(str(num[0])+'-'+str(num[1])+'-'+str(num[2])+'-'+str(m))
发表于 2022-04-26 17:47:34 回复(0)
a = input()
s = a.split("-")
a = s[0]
b = s[1]
c = s[2]
d = s[3]
if d == "X":
    d = 10
mix = 1*int(a)+2*int(b[0])+3*int(b[1])+4*int(b[2])+5*int(c[0])+6*int(c[1])+7*int(c[2])+8*int(c[3])+9*int(c[4])
end = mix%11
if end == int(d):
    print("Right")
else:
    if end == 10:
        end = "X"
        print(f"{a}-{b}-{c}-{end}")
    else:
        print(f"{a}-{b}-{c}-{end}")
发表于 2022-04-21 11:36:02 回复(0)
prev = input()
l = prev.replace('-','')

total = 0
for i in range(len(l)-1):
    total += int(l[i])*(i+1)
code  = str(total%11)
if code == '10':
    code = 'X'
# 检查
print('Right' if code == prev[-1] else prev[:-1]+code)

发表于 2022-03-26 22:24:11 回复(0)