很简单吧。。却写了70分,不想再找错了
有空了再说吧
(会有空吗?卒)
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
cin>>s;
string res="";
int wei=1;
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]=='-')
continue;
else{
if(i==s.size()-1){
if(s[i]-'0'==count||(count==10&&s[i]=='X'))
res="Right";
else{
s[i]=count+'0';
res=s;
}
}else{
count+=(s[i]-'0')*wei;
count%=11;
wei++;
}
}
}
cout<<res<<endl;
return 0;
}
试题编号: 201312-2
试题名称: ISBN号码
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-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<string>
using namespace std;
string your(string s){
string res="";
int sum = 0; // 累加器,用来存储当前的和,初始化为 0
int p = 1; // 乘的系数,初始化为 1
int len = s.size(); // 号码的长度
for (int i = 0; i < len - 1; i++) {
if (s[i] == '-') continue;
sum += (s[i] - '0') * p;
p++;
}
// 先将 sum % 11 的值转成对应的字符 c,0~9 转成对应的字符 '0'~'9',10 转成 'X'
char c;
if (sum % 11 == 10) c = 'X'; // 10 转成 'X'
else c = (sum % 11) + '0'; // 0~9 转成对应的字符 '0'~'9'
if (c == s[len - 1]) { // 若 c 为号码的最后一位
res= "Right"; // 则输出 Right
} else { // 若 c 不为号码的最后一位
s[len - 1] = sum % 11+'0'; // 将号码的最后一位改为正确的
res= s; // 输出改过的号码
}
return res;
}
string my(string s){
string res="";
int wei=1;
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]=='-')
continue;
else{
if(i==s.size()-1){
if(s[i]-'0'==count||(count==10&&s[i]=='X'))
res="Right";
else{
s[i]=count+'0';
res=s;
}
}else{
count+=(s[i]-'0')*wei;
count%=11;
wei++;
}
}
}
return res;
}
void test(){
string s;
s="0-670-82162-4";
int p=0;
for(int i=0;i<=9;i++){
s[p++]=i+'0';
s[p++]='-';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
s[p++]='-';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
for(int i=0;i<=9;i++){
s[p++]=i+'0';
s[p++]='-';
for(int i=0;i<=9;i++){
s[p]=i+'0';
// cout<<"test: "<<s<<endl;
if(your(s)!=my(s)){
cout<<"error: "<<s<<endl;;
cout<<my(s)<<endl;
cout<<your(s)<<endl;
}
}
p--;
p--;
}
p--;}
p--;}
p--;}
p--;}
p--;p--;}
p--;}
p--;}
p--;p--;}
cout<<"----"<<s<<end
}
int main(){
test();
return 0;
}