洛谷P1055 ISBN号码

题目描述
每一本正式出版的图书都有一个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;
 } 

总结
这一题最关键的是要算出识别码,将算出的识别码与输入的最后一位识别码相比较,
并根据题目要求输出即可,我感觉可能大家最想不到的地方就是将字符转化为数字。
这就需要我们在写代码的过程中多积累经验了。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值