问题描述
试题编号: 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
试题编号: 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;
}