CCF CSP 编程题目和解答-----试题名称: ISBN 号码 -------201312-2

问题描述 
试题编号: 201312-2 
试题名称: ISBN 号码 
时间限制: 1.0s 
内存限制: 256.0MB 
问题描述: 
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包 括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如“x-xxxxxxxx-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 



/**解题思路:

本题主要的工作在于实现一个字符串的分割函数

其余工作就是按照题目意思计算最后一位识别码就好了

**/

//以下代码是本人根据自己的理解编写,不一定是最好的解决思路,有更好思路的大佬欢迎指正。

#include<iostream>  
#include<vector>  
#include<string>  
#include<bitset>  
#include<map>  
#include<algorithm>  
#include<queue>  
using namespace std;

vector<string> split(string str, string separator)//字符串分割函数  
{
	vector<string> result;
	int cutAt;
	while ((cutAt = str.find_first_of(separator)) != str.npos)
	{
		if (cutAt > 0)
		{
			result.push_back(str.substr(0, cutAt));
		}
		else {
			result.push_back("");
		}
		str = str.substr(cutAt + 1);
	}
	if (str.length() > 0)
	{
		result.push_back(str);
	}
	else {
		result.push_back("");
	}
	return result;
}


int main()
{
	string in;
	cin >> in;
	vector<string> parameter = split(in, "-");
	string realnum = parameter[0] + parameter[1] + parameter[2];
	long long sum = 0;//存储最后计算的和  
	for (int i = 0; i < realnum.length(); i++)
	{
		sum += (realnum[i] - '0') * (i + 1);
	}
	int yushu = sum % 11;//计算正确的余数
	
	bool flag = false;//设置标志位
	
	if (0 == parameter[3].compare("X"))//如果输入的识别码是X
	{
		if (yushu == 10)
			flag = true;
	}
	else {   //如果输入的识别码不是X
		int t = atoi(parameter[3].c_str());
		if (t == yushu)
			flag = true;


	}
	


	if (flag)
		cout << "Right" << endl;
	else
	{
		cout << parameter[0] + "-" + parameter[1] + "-" + parameter[2] + "-";
		if (yushu == 10)
			cout << "X" << endl;
		else
			cout << yushu << endl;
	}


}


-----------------------------------------------------------------------------------华丽的更新线------------------------------------------------------------------------

之前使用的split函数是从网上找到的,今天自己又改进了一下,在这里记录下来,以便以后使用。

vector<string> split(string in, string sp)
{
	vector<string> rt;
	while (in.find(sp) != -1)
	{
		string tem = in.substr(0, in.find(sp));
		if(tem!="")
		rt.push_back(tem);
		in = in.substr(in.find(sp) + 1);
	}
	if(in!="")
	rt.push_back(in);
	return rt;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值