链接:https://ac.nowcoder.com/acm/contest/19304/W 来源:牛客网
每一本正式出版的图书都有一个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 第一个次错误是把X当作%d输入了当时想的是字符型和整型可以互用但这是错的 第二个次错误是每个判断后的printf第四个%d直接把d输出了没有更改 第三个错误是x以%d的形式输出了 然后是sum%11==d-48当时直接把它当d整型处理了 后来调试了一个0-070-00000-6本来是为了测试余数为十的情况结果发现输出的没有前面的零就按位数一个一个输出了 不过这个题好像对这个没有要求,验证了确实没要求 听了讲课后又想起来了%1d,%3d可以确保是读入是几位。 %05的话可以五位数然后补零 #include<bits/stdc++.h> using namespace std; int main(){ int a,b,c,sum; char d; scanf("%d-%d-%d-%c",&a,&b,&c,&d); int b1,b2,b3; int c1,c2,c3,c4,c5; b1=b/100; b2=b/10%10; b3=b%10; c1=c/10000; c2=c/1000%10; c3=c/100%10; c4=c/10%10; c5=c%10; sum=a1+b12+3b2+4b3+5c1+6c2+7c3+8c4+9c5; if(sum%11==10){ if(d=='X'){ printf("Right"); } else printf("%d-%d%d%d-%d%d%d%d%d-%c",a,b1,b2,b3,c1,c2,c3,c4,c5,'X'); } else{ if(sum%11==d-48){ printf("Right"); } else{ printf("%d-%d%d%d-%d%d%d%d%d-%d",a,b1,b2,b3,c1,c2,c3,c4,c5,sum%11); } } return 0; } #include<bits/stdc++.h> using namespace std; int main(){ int a,b,c,d,e,f,g,h,i,sum; char j; scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); sum=a1+b2+3c+4d+5e+6f+7g+8h+9i; if(sum%11==10){ if(j=='X'){ printf("Right"); } else printf("%d-%d%d%d-%d%d%d%d%d-%c",a,b,c,d,e,f,g,h,i,'X'); } else{ if(sum%11==j-48){ printf("Right"); } else{ printf("%d-%d%d%d-%d%d%d%d%d-%d",a,b,c,d,e,f,g,h,i,sum%11); } } return 0; }