【洛谷 P1055】[NOIP2008 普及组] ISBN 号码 题解(字符串)

简介: 该编程题目要求编写程序检查输入的ISBN号码的识别码是否正确。ISBN号码格式为`x-xxx-xxxxx-x`,其中`x`是数字,最后一位是通过特定算法计算得出的识别码。算法是将前9位数字乘以1到9的加权值,求和后对11取模,模为10时识别码为大写`X`,否则为对应模值的数字。程序接收一个符合格式的ISBN号码,验证识别码并输出`Right`(如果正确)或修正后的正确ISBN号码。提供的AC代码使用C++实现这一功能。

[NOIP2008 普及组] ISBN 号码

题目描述

每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 $9$ 位数字、$1$ 位识别码和 $3$ 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 $0$ 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 $670$ 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以 $1$ 加上次位数字乘以 $2$ ……以此类推,用所得的结果 $ \bmod 11$,所得的余数即为识别码,如果余数为 $10$,则识别码为大写字母 $X$。例如 ISBN 号码 0-670-82162-4 中的识别码 $4$ 是这样得到的:对 067082162 这 $9$ 个数字,从左至右,分别乘以 $1,2,\dots,9$ 再求和,即 $0\times 1+6\times 2+……+2\times 9=158$,然后取 $158 \bmod 11$ 的结果 $4$ 作为识别码。

你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。

输入格式

一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。

输出格式

一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -)。

样例 #1

样例输入 #1

0-670-82162-4

样例输出 #1

Right

样例 #2

样例输入 #2

0-670-82162-0

样例输出 #2

0-670-82162-4

提示

2008 普及组第一题

思路

判断计算出的识别码与所给的识别码是否匹配。若取余得到10则要用X代替。

AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

void read(int &x){
   
    char ch = getchar();
    while('0' > ch || '9' < ch){
   
        ch = getchar();
    }
    x = ch - '0';
    // cout << x << endl;
}

int main() {
   
    int ck;
    char ck1;
    char ck2;
    int sum = 0;
    int code[10];
    for(int i = 1; i <= 9; i++){
   
        int x;
        read(x);
        code[i - 1] = x;
        sum += x * i;
    }
    getchar();
    ck1 = getchar();
    ck = sum % 11;
    if(ck != 10){
   
        ck2 = (char)(ck + '0');
    } else {
   
        ck2 = 'X';
    }
    if(ck1 == ck2){
   
        cout << "Right" << endl;
    } else {
   
        for(int i = 0; i < 9; i++){
   
            cout << code[i];
            if(0 == i || 3 == i){
   
                cout << "-";
            }
        }
        cout << "-" << ck2;
    }
    return 0;
}
目录
相关文章
【2001NOIP普及组】T3. 求先序排列 试题解析
【2001NOIP普及组】T3. 求先序排列 试题解析
|
6月前
|
C++
【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(字符串)
**NOIP2011普及组题目:给定整数N,反转其位得到新数。新数首位非0(除非N=0)。输入0时直接输出0,其他情况输出反转后的数,考虑负数及前导0。提供的C++代码实现通过读入字符串,反转数字顺序并处理符号和前导0。**
38 0
|
6月前
【洛谷 P1980】[NOIP2013 普及组] 计数问题 题解(取余)
NOIP2013普及组计数问题,求区间[1, n]内数字x出现的次数。输入为n和x,输出x的出现次数。样例输入11 1,输出4。代码通过逐位检查每个数是否等于x来计数,适用于$n\leq10^6$,$0\leq x\leq 9$的情况。
74 0
|
6月前
【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(取余)
NOIP2011普及组试题,要求反转整数N的位得到新数,保持正负号和非零最高位。输入一个整数N,输出反转后的新数。样例输入1:123,输出:321;样例输入2:-380,输出:-83。代码使用取余法实现,处理负数时保留符号。
59 0
|
6月前
【洛谷 P1909】[NOIP2016 普及组] 买铅笔 题解(打擂台法)
**摘要:** P老师需买$n$支铅笔作礼物,商店有3种包装(数量、价格不等),不能拆包。目标是最少花费。输入包括$n$和每种包装的详情,输出最小花费。样例展示最优选择过程。代码使用打擂台法求解,读入$n$和包装信息,计算每种包装的最小花费,取最小值输出。
78 0
|
6月前
|
C++
【洛谷 P1059】[NOIP2006 普及组] 明明的随机数 题解(集合)
**NOIP2006普及组题目**,明明需生成不重复的1-1000间随机整数,输入含两行:第一行是整数N(≤100),第二行是N个随机数。输出两行,第一行是唯一数的个数M,第二行是排序后的唯一数。示例:输入10个数含重复,输出8个不同数排序后结果。解题方法:利用C++的`set`进行去重和排序。
71 0
|
6月前
【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
**NOIP2007普及组奖学金问题**:根据学生语文、数学、英语三科成绩计算总分并排序。若总分相同,按语文成绩高者优先,再相同则学号小者靠前。程序需输出前5名学生的学号和总分。输入包括学生人数`n`和每人的三科成绩,输出为5行结果。示例输入和输出已给出,代码通过定义结构体和自定义比较器实现排序。
52 0
|
6月前
|
C++
【洛谷 P1085】[NOIP2004 普及组] 不高兴的津津 题解(打擂台法)
**NOIP2004 普及组问题:津津的日程检查。津津每日上课时间若超8小时会不高兴。输入7行代表一周课程,输出最不高兴的日期(1-7)或0。示例输入/输出:5 3 6 2 7 2 5 3 5 4 0 4 0 6 -&gt; 3。使用C++代码通过遍历计算最大上课时间并找到对应日期。**
43 0
|
6月前
【洛谷 P2669】[NOIP2015 普及组] 金币 题解(循环)
`NOIP2015`普及组题目,骑士按周期领金币:第一天1枚,随后$n$天每天$n$枚,然后$n+1$天每天$n+1$枚。给定天数$k$,求总金币数。输入$k$,输出金币总数。样例输入6,输出14;输入1000,输出29820。代码使用循环和变量控制周期,累计金币数。
137 0
|
6月前
|
C++
【洛谷 P1075】[NOIP2012 普及组] 质因数分解 题解(判断质数)
NOIP2012普及组题目,给定合数$n$由两个不同质数乘积组成,求较大质数。输入一个正整数$n$,输出较大质因子。例如输入21,输出7。代码使用C++,通过循环和质数判断找到能整除$n$的质数,再求另一个质数,并输出较大者。
83 0