厦门大学夏令营机试第四题-13位ISBN号的校验码计算和输出

题目描述

编写一个程序,根据输入的13位ISBN书号(可能包含分隔符“-”)求出对应的校验码,并用校验码替换最后一位书号,最后输出替换后的书号(输出中保留原有的分隔符)。

13位ISBN校验码计算方法如下:

  1. 移除输入中所有的分隔符“-”。
  2. 将前12位数字从左到右依次标记为 \( d1, d_2, \ldots, d{12} \)。
  3. 计算校验和:
    \[ S = d1 + 3 \cdot d_2 + d_3 + 3 \cdot d_4 + \ldots + d{11} + 3 \cdot d_{12} \]
  4. 校验码为:
    \[C=(10-(S\%10))\% 10\]
  5. 用校验码替换书号的最后一位数字。
  6. 输出带有分隔符的ISBN书号。

题解

  1. 从输入中读取13位ISBN书号,并移除其中的所有分隔符“-”。
  2. 计算前12位数字的校验和。
  3. 根据校验和计算校验码。
  4. 将校验码替换书号的最后一位。
  5. 输出带有分隔符的替换后的书号。

代码实现

下面是实现上述逻辑的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;

// 移除ISBN中的分隔符
string remove_hyphens(const string& isbn) {
string clean_isbn;
for (char c : isbn) {
if (c != '-') {
clean_isbn += c;
}
}
return clean_isbn;
}

// 计算13位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;
}

// 恢复原始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;

// 连续输入ISBN号
while (true) {
cin >> isbn;
if (isbn == "EXIT") {
break;
}
isbns.push_back(isbn);
}

// 处理并输出每个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

作者

Xiongyuqi

发布于

2024-08-07

更新于

2024-08-08

许可协议

评论