题目描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如00代表英语;第一个分隔符-之后的三位数字代表出版社,例如670670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9再求和,即0×1+6×2+……+2×9=158,然后取158mod11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。
输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符 -)。
题目描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如00代表英语;第一个分隔符-之后的三位数字代表出版社,例如670670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
源代码
#include<iostream>//C++标准输入输出头文件
#include<string> //因为要用到字符串,所以要添加string头文件
using namespace std;//添加命名空间
int main()//主函数
{ char s[14],c;//定义字符数组接收ISBN码;定义识别码C
cin>>s;//输入ISBN码
int x=0;//定义 x作为每一位标识码要乘的数
int sum=0;//定义sum记录总数,算出识别码
for(int i=0;i<11;i++)//遍历整个ISBN码
{
if(s[i]!='-')//如果字符不是 —
{
x++;//使x等于当前标识码所在的位数
sum+=x*(s[i]-'0');//将标识码乘以所在的位数并加到sum中 ;减'0' 是为了将字符变成数字
}
}
sum%=11;//根据题目要求取sum除以11的余数
if(sum==10)//如果sum等于10
{
c='X';//将识别码变成X
}
else//如果sum不等于10
{
c=sum+'0';//将算出的识别码赋值给c;加'0'是为了将数字转化为字符
}
if(c==s[12])//判断识别码是否正确
{
cout<<"Right"<<endl;//根据题目要求,正确输出Right
}
else//如果不正确
{
s[12]=c;//将识别码换成正确的识别码
cout<<s;//输出正确的ISBN码
}
system("pause");
return 0;
}
总结
这一题最关键的是要算出识别码,将算出的识别码与输入的最后一位识别码相比较,
并根据题目要求输出即可,我感觉可能大家最想不到的地方就是将字符转化为数字。
这就需要我们在写代码的过程中多积累经验了。