洛谷选题:P1055 [NOIP 2008 普及组] ISBN 号码

【题目】

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

识别码的计算方法如下:

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

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

输入格式

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

输出格式

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

输入样例1:

0-670-82162-4

输出样例1:

Right

输入样例2:

0-670-82162-0

输出样例2:

0-670-82162-4

【解题思路】

第一步:先查找字符串中除了最后一个数字之外的所有数字

第二步:如果找到数字,则根据题目要求用该数字乘以k(k表示该数字在 ISBN 号码中是第一个数字),并且累加到一个变量sum中。

第三步:根据题目要求,判断正确的 ISBN 号码最后一位字符是'X'还是实际数字。

第四步:正确的 ISBN 号码和样例输入中的 ISBN 号码最后一位字符是否相等,并输出相应的信息。

【代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{

    string str;//因为 ISBN 号码既包括字符也包括数字,所以用string存储方便后期操作
    cin>>str;
    int k=1;//表示找到的第几个数字字符
    int sum=0;//用来存储所有数字字符转换之后的累加和

    //第一步:先查找字符串中除了最后一个数字之外的所有数字
    for(int i=0;i<=10;i++)
    {
        //第二步:如果找到数字,则根据题目要求用该数字乘以k,k表示是第一个数字,并且累加
      //注意k不是数字在字符串中的位置,所以不能用i代替,这是一个小难点,要单独用一个变量表示。
        //而且每次用完k,k要+1.
        if(str[i]>='0'&&str[i]<='9')
        {
            //因为数字存在了字符串中,所以要做一个字符转整形,因为0~9的ascll码从48开始,    
            //所以可以用(int(str[i])-48)将'0'~'9'转为0~9 
            sum+=(int(str[i])-48)*k;  
            k++;

        }
    } 
    //第三步:判断正确的 ISBN 号码最后一位字符是什么
    char s;//存储最后一个字符的正确表示
    if(sum%11==10)//根据题目要求,求和之后如果对11取余为10,则 ISBN 号码最后一位用'X'表示
        s='X';
    else
        s=char(sum%11+48);//否则就用实际的数字表示,这用了一个数字正形专对应的ascll码
    //第四步:正确的 ISBN 号码和输入的 ISBN 号码最后一位字符是否相等,并输出相应的信息
    if(str[12]==s)
        cout<<"Right";
    else
    {
        str[12]=s;
       cout<<str; 
    }
        
    return 0;
}

【划重点】

本题有几个小难点:

一是 要知道数字和对应的ascll码的转换方法;二是数字在 ISBN 号码中的位置并不是该数字需要✖️的数值,数字需要✖️的数值应该是找到的第几个数字。

相关推荐
学逆向的12 分钟前
C++ 别名命名空间
开发语言·c++·网络安全
小郎君65813 分钟前
keep-alive 页面怎么“真刷新”?别改外层 key——一个 refreshVersion 的完整实现
vue.js·算法
David猪大卫29 分钟前
【C++修炼】STL容器—stack与queue
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
瑶池酒剑仙30 分钟前
C++变量初始化五法完全指南:默认/拷贝/直接/列表/值初始化与窄化转换陷阱(青云之志)
c语言·开发语言·数据结构·c++·算法·visual studio
raindayinrain31 分钟前
c++对象模型--指针
开发语言·c++
用户2380030994533 分钟前
从零开始实现扫雷游戏(C 语言控制台版)
算法
流年如夢41 分钟前
stack和queue_介绍、用法及模拟实现
c++·stl·queue·stack·priority_queue
国科安芯1 小时前
星上计算的第一道防线:低轨遥感卫星载荷处理链中的AS32S601型抗辐射MCU—— 面向高分辨率成像与在轨智能处理的场景化综述
大数据·网络·人工智能·单片机·算法·低轨卫星·抗辐射
chenbingjie_c1 小时前
C++ 模板进阶:从 “会用“ 到 “懂底层“(非类型参数・特化・分离式编译)
c++·后端
thusloop1 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex