【题目链接】
ybt 1942:【08NOIP普及组】ISBN号码
OpenJudge NOI 1.7 29:ISBN号码
洛谷 P1055 [NOIP2008 普及组] ISBN 号码
【题目考点】
1. 字符串
【解题思路】
整个字符串长度为len,最后识别码的下标为len-1。i从0遍历到len-2,只要不是’-’,那么就将该位置的数字乘以一个不断变大的数字p而后加和。
根据加和求出识别码。
判断求出的识别码和原识别码是否相同,相同则输出"Right",不同则替换原识别码,而后输出。
【题解代码】
解法1:使用字符数组
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[20], cr;//cr:经过计算得到的正确的识别码
cin >> s;
int len = strlen(s), p = 1, sum = 0;//p:每次乘的数字,第一次乘1,第二次乘2...
for(int i = 0; i < len - 1; ++i)//从下标0遍历到识别码前面的位置
{
if(s[i] != '-')
{
sum += p * (s[i] - '0');
p++;
}
}
if(sum % 11 == 10)
cr = 'X';
else
cr = '0' + sum % 11;
if(s[len-1] == cr)//如果正确的识别码和原识别码相同
cout << "Right";
else
{
s[len-1] = cr;//替换识别码
cout << s;
}
return 0;
}
解法2:使用string类
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
char r, cr;//r:原识别码 cr:经过计算得到的正确的识别码
int p = 1, sum = 0;//p:每次乘的数字,第一次乘1,第二次乘2...
cin >> s;
r = s.back(), s.pop_back();//取出并去掉末尾识别码
for(int i = 0; i < s.length(); ++i)//遍历到识别码前面的位置
if(s[i] != '-')
sum += p++ * (s[i] - '0');
cr = sum % 11 == 10 ? 'X' : '0' + sum % 11;
if(r == cr)//如果正确的识别码和原识别码相同
cout << "Right";
else
{
s.push_back(cr);//添加识别码
cout << s;
}
return 0;
}