QOJ.ac

QOJ

时间限制: 1 s 内存限制: 2048 MB 总分: 100

#7698. ISBN 转换

统计

ISBN(国际标准书号)是分配给已出版书籍的特定版本/形式的唯一标识符(例如,同一版本的精装本和平装本具有不同的 ISBN)。2007 年之前分配的 ISBN 为 10 位长(ISBN-10 标准),而 2007 年 1 月 1 日及之后分配的 ISBN 为 13 位长(ISBN-13 标准)。一些 2007 年之前出版且仍在印刷的书籍同时拥有原始的 ISBN-10 和匹配的 ISBN-13,一些较新的书籍也同时拥有 ISBN-10 和 ISBN-13,前者是为了向后兼容。这种“双重身份”的情况构成了本题的基础,要求你将有效的 ISBN-10 转换为对应的 ISBN-13。

任何 ISBN 的最后一位都是校验位,可用于简单的错误检测。ISBN-10 和 ISBN-13 使用不同的规则来计算/验证最后一位:

  1. ISBN-10:如果从左到右的 10 位数字为 $d_1, d_2, \dots, d_{10}$(其中 $d_{10}$ 是校验位),且 $$S = 10 \cdot d_1 + 9 \cdot d_2 + 8 \cdot d_3 + \dots + 2 \cdot d_9 + 1 \cdot d_{10}$$ (系数从 10 递减到 1),则 $S$ 必须是 11 的倍数,即 $S \equiv 0 \pmod{11}$。

  2. ISBN-13:如果从左到右的 13 位数字为 $d_1, d_2, \dots, d_{13}$(其中 $d_{13}$ 是校验位),且 $$S = 1 \cdot d_1 + 3 \cdot d_2 + 1 \cdot d_3 + 3 \cdot d_4 + \dots + 3 \cdot d_{12} + 1 \cdot d_{13}$$ (奇数位乘以 1,偶数位乘以 3),则 $S$ 必须是 10 的倍数,即 $S \equiv 0 \pmod{10}$。

不难看出,每条规则都能唯一确定校验位(给定其他数字的情况下)。

X 因子:注意 ISBN-10 的一个虽小但重要的细节,该细节不适用于 ISBN-13:由于模数为 11,校验位的值位于 $\{0, 1, 2, \dots, 9, 10\}$ 中。在校验位值为 10 的特殊情况下,它被写为 X,以便只需要一个字符。例如,039428013X 是一个有效的 ISBN-10。

连字符:从技术上讲,ISBN-10 由四个部分组成,其中一个是校验位。(定义前三个部分的具体规则很复杂,因此我们在此不予处理。)两个相邻的部分可以可选地用连字符分隔,这意味着 ISBN-10 最多可以包含三个连字符,但它不能以连字符开头或结尾,也不能包含连续的连字符。如果有三个连字符,其中一个必须将校验位与它前面的数字分隔开(如果连字符少于三个,校验位与它前面的数字之间可能有也可能没有连字符)。因此,就本题而言,以下是有效的 ISBN-10:

039428013-X 0-39-428013X 3-540-42580-2 3540425802

以下是无效的 ISBN-10(前两个是因为连字符放置错误,最后一个是因为未通过上述校验测试):

3-540-4258-02 3-540-425802- 0-14-028333-3

如何将 ISBN-10 转换为 ISBN-13?只需 (i) 在前面加上数字 978,(ii) 去掉旧的校验位,以及 (iii) 按照 ISBN-13 规则附加一个新的校验位。为简单起见,保持现有连字符的位置,并在前缀 978 后面加上一个连字符。

输入格式

输入的第一行包含一个整数 $T$ ($1 \le T \le 25$),表示要处理的(可能无效的)ISBN-10 的数量。随后是 $T$ 行,每行包含一个长度在 10 到 13 之间的非空字符串。每个字符要么是十进制数字('0' 到 '9'),要么是连字符('-'),要么是 'X'(大写 X)。

输出格式

对于每个测试用例,如果候选 ISBN-10 根据上述细节无效,则输出一行 "invalid"。否则,输出一行包含对应的 ISBN-13。

样例

样例输入 1

4
3-540-4258-02
039428013X
3-540-42580-2
0-14-028333-3

样例输出 1

invalid
978-0394280134
978-3-540-42580-9
invalid

Figure 1. An example of an ISBN-10 and its corresponding ISBN-13 barcode.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.