CSP-201312-2-ISBN号码
解题思路
-
输入ISBN码:从用户接收一个ISBN字符串。
-
初始化变量:创建一个向量
verifyArray
来存储ISBN的前9位数字,和两个整数identificationCode
和checkSum
分别用于存储ISBN的校验位和计算出的校验和。 -
处理ISBN字符串:遍历整个ISBN字符串,分别处理前9位数字和最后一位校验位。
- 如果字符是数字(‘0’-‘9’),将其转换为数字并添加到
verifyArray
中。 - 如果是最后一位,判断是否为’X’,如果是,则将
identificationCode
设置为10;如果不是,则转换为相应的数字。
- 如果字符是数字(‘0’-‘9’),将其转换为数字并添加到
-
计算校验和:遍历
verifyArray
,将每个数字乘以其位置(1到9),将这些乘积加起来得到总和,然后将总和对11取余得到checkSum
。 -
检查和修正ISBN码:
- 如果
checkSum
与identificationCode
相等,则ISBN码正确,输出“Right”。 - 如果不相等,则修正最后一位校验位为正确的校验位(如果
checkSum
为10,则修正为’X’;否则,转换为相应的数字),并输出修正后的ISBN码。
- 如果
完整代码
#include <iostream>
#include <vector>
using namespace std;
vector<int>verifyArray;
int identificationCode, checkSum;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string ISBN;
cin >> ISBN;
for (int i = 0; i < ISBN.size(); i++)
{
// 处理识别码
if (i == ISBN.size() - 1)
{
if (ISBN[i] == 'X') // 识别码:10
{
identificationCode = 10;
}
else // 识别码:0-9
{
identificationCode = ISBN[i] - '0';
}
break;
}
// 处理校验位
if (ISBN[i] >= '0' && ISBN[i] <= '9')
{
int verifyNumber = ISBN[i] - '0'; // 转化为数字
verifyArray.push_back(verifyNumber);
}
}
// 计算校验和
for (int i = 1; i <= 9; i++)
{
checkSum += i * verifyArray[i - 1];
}
checkSum %= 11;
// 检查结果
if (checkSum == identificationCode) {
cout << "Right";
}
else
{
// 修正ISBN码
if (checkSum == 10) // 识别码:10
{
char t = 'X';
ISBN[ISBN.size() - 1] = t;
}
else // 识别码:0-9
{
char t = checkSum + '0';
ISBN[ISBN.size() - 1] = t;
}
cout << ISBN;
}
return 0;
}