试题编号: | 201312-2 |
试题名称: | ISBN号码 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。 输入格式 输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 输出格式 输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 样例输入 0-670-82162-4 样例输出 Right 样例输入 0-670-82162-0 样例输出 0-670-82162-4 |
其实很简单的题 做麻烦了 不过用到了大佬的STL实现的split (java和Python都可以用 然而c++没有)
#include <vector>
#include <string>
#include <iostream>
using namespace std;
vector<string> split(const string &s, const string &seperator)
{
vector<string> result;
typedef string::size_type string_size;
string_size i = 0;
while(i != s.size())
{
//找到字符串中首个不等于分隔符的字母;
int flag = 0;
while(i != s.size() && flag == 0)
{
flag = 1;
for(string_size x = 0; x < seperator.size(); ++x)
if(s[i] == seperator[x])
{
++i;
flag = 0;
break;
}
}
//找到又一个分隔符,将两个分隔符之间的字符串取出;
flag = 0;
string_size j = i;
while(j != s.size() && flag == 0)
{
for(string_size x = 0; x < seperator.size(); ++x)
if(s[j] == seperator[x])
{
flag = 1;
break;
}
if(flag == 0)
++j;
}
if(i != j)
{
result.push_back(s.substr(i, j-i));
i = j;
}
}
return result;
}
int main()
{
string aa;
while(cin>>aa)
{
vector<string> v = split(aa, "-");
int tt=0;
int c=1;
for(vector<string>::size_type i = 0; i != v.size()-1; ++i)
{
for(int j=0;j<v[i].length();j++)
{tt+=(int(v[i][j])-48)*c;
tt%=11;
c++;
}
}
int cc=0;
for(int j=0;j<v[3].length();j++)
{
cc*=10;
cc+=(int(v[3][j])-48);
}
if(tt==10&&v[3]=="X")
cout<<"Right"<<endl;
else if(tt==cc&&tt!=10)
cout<<"Right"<<endl;
else if (tt==10)
cout<<v[0]<<"-"<<v[1]<<"-"<<v[2]<<"-"<<"X"<<endl;
else
cout<<v[0]<<"-"<<v[1]<<"-"<<v[2]<<"-"<<tt<<endl;
}
return 0;
}