题目描述
编写一个程序,根据输入的13位ISBN书号(可能包含分隔符“-”)求出对应的校验码,并用校验码替换最后一位书号,最后输出替换后的书号(输出中保留原有的分隔符)。
13位ISBN校验码计算方法如下:
- 移除输入中所有的分隔符“-”。
- 将前12位数字从左到右依次标记为 \( d1, d_2, \ldots, d{12} \)。
- 计算校验和:
\[ S = d1 + 3 \cdot d_2 + d_3 + 3 \cdot d_4 + \ldots + d{11} + 3 \cdot d_{12} \]
- 校验码为:
\[C=(10-(S\%10))\% 10\]
- 用校验码替换书号的最后一位数字。
- 输出带有分隔符的ISBN书号。
题解
- 从输入中读取13位ISBN书号,并移除其中的所有分隔符“-”。
- 计算前12位数字的校验和。
- 根据校验和计算校验码。
- 将校验码替换书号的最后一位。
- 输出带有分隔符的替换后的书号。
代码实现
下面是实现上述逻辑的C++代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <iostream> #include <string> #include <vector> #include <algorithm>
using namespace std;
string remove_hyphens(const string& isbn) { string clean_isbn; for (char c : isbn) { if (c != '-') { clean_isbn += c; } } return clean_isbn; }
int calculate_checksum(const string& isbn) { int sum = 0; for (int i = 0; i < 12; ++i) { int digit = isbn[i] - '0'; if (i % 2 == 0) { sum += digit; } else { sum += 3 * digit; } } int checksum = (10 - (sum % 10)) % 10; return checksum; }
string replace_checksum(string isbn) { int checksum = calculate_checksum(isbn); isbn[12] = '0' + checksum; return isbn; }
string format_isbn(const string& original, char checksum_char) { string formatted_isbn = original; formatted_isbn[original.size() - 1] = checksum_char; return formatted_isbn; }
int main() { vector<string> isbns; string isbn;
cout << "请输入13位ISBN号(可能包含分隔符'-'),输入完毕后输入'EXIT':" << endl;
while (true) { cin >> isbn; if (isbn == "EXIT") { break; } isbns.push_back(isbn); }
for (const string& isbn : isbns) { string clean_isbn = remove_hyphens(isbn);
if (clean_isbn.length() != 13) { cout << "输入的ISBN号长度不正确,移除分隔符后必须是13位: " << isbn << endl; continue; }
int checksum = calculate_checksum(clean_isbn); char checksum_char = '0' + checksum; string formatted_isbn = format_isbn(isbn, checksum_char);
cout << "原始ISBN号: " << isbn << " -> 新的ISBN号是: " << formatted_isbn << endl; }
return 0; }
|
示例1
输入:
1 2 3 4
| 输入13位ISBN号(可能包含分隔符'-'),输入完毕后输入'结束': 978-0-306-40615-3 978-0-306-40615-7 EXIT
|
输出:
1 2
| 原始ISBN号: 978-0-306-40615-3 -> 新的ISBN号是: 978-0-306-40615-7 原始ISBN号: 978-0-306-40615-7 -> 新的ISBN号是: 978-0-306-40615-7
|