CCF CSP-认证历年题目自练 Day4

CCF CSP-认证历年题目自练 Day4

问题描述
试题编号: 201312-2
试题名称: ISBN号码
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  每一本正式出版的图书都有一个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号码(包括分隔符“-”)。
样例输入
0-670-82162-4
样例输出
Right
样例输入
0-670-82162-0
样例输出
0-670-82162-4

题目分析(自己理解)

  1. 这题是个纸老虎,也就13年的题目简单了,直接看,识别码的计算方法如下:(不分析了,太简单)前面的都不重要,这里看输入,有数字有字符,如果是空格将数字分开,我直接list(map(int,input().split())),但是,这种输入只能是string型,但是后面牵扯到数字的计算,所以我选择切片然后拼接(直接把数字拎出来)方便我后面乘位序求模的操作,OK!,给一个输入:ret=input()
    然后把是数字的元素切片,再拼接l=ret[0]+ret[2:5]+ret[6:11]

  2. 需要做乘法的只有9个数,因此我用for循环迭代的时候range(9)就完事。for i in range(9)

  3. 做怎样的乘法?l[i]*(i+1) #但是l[i]是string型,强制转换int s=int(l[i])

  4. 设置总数让我们去求模,num=0 num+=(s*(i+1))

  5. 设置模 e=num%11

  6. 现在可以考虑输出的问题了,当e是10时,l[12]如果是“X”则“RINGHT”,不是“X“时输出ret[0:12] + ‘X’。当不是10时,l[12]是e的值(string)。注意列表的切片左闭右开!像这种多分枝结构,我选择if else 。满足条件的直接输出Right,不满足条件的直接将前面的十二个元素切下来,然后拼接它该拼接的e.然后输出,结束!

  7. 上代码:

ret=input()
l=ret[0]+ret[2:5]+ret[6:11]
num=0
for i in range(9):
    s=int(l[i])
    num+=((i+1)*s)
e=num%11
if e==10:
    if ret[12]=='X':
        print("Right")
   else:
        print(ret[0:12] + 'X')
else:
    if ret[12]=='X':
        print(ret[0:12] + str(e))
    else:
       x = int(ret[12])
        if e == x:
            print("Right")
        else:
            print(ret[0:12]+str(e))

总结

简单,稍稍注意一下列表的操作就ok。
家乡的风景:CCF CSP-认证历年题目自练 Day4_第1张图片

CCF CSP-认证历年题目自练 Day4_第2张图片
感谢学校的多媒体,不然眼睛真的会瞎掉。
CCF CSP-认证历年题目自练 Day4_第3张图片

你可能感兴趣的:(算法,python)