洛谷选题: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 号码中的位置并不是该数字需要✖️的数值,数字需要✖️的数值应该是找到的第几个数字。

相关推荐
RFdragon8 小时前
分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)
人工智能·线性代数·算法·机器学习·计算机视觉·矩阵·paddlepaddle
浅念-11 小时前
Linux 开发环境与工具链
linux·运维·服务器·数据结构·c++·经验分享
旺仔.29111 小时前
容器适配器:stack栈 、queue队列、priority queue优先级队列、bitset位图 详解
c++
刘景贤13 小时前
C/C++开发环境
开发语言·c++
Zero14 小时前
机器学习微积分--(1)核心思想
人工智能·算法·机器学习
OasisPioneer14 小时前
现代 C++ 全栈教程 - Modern-CPP-Full-Stack-Tutorial
开发语言·c++·开源·github
有Li14 小时前
一种病理学内容感知变速率学习图像压缩框架 (PathoLIC)/文献速递-多模态应用技术
人工智能·深度学习·算法·计算机视觉·医学生
liulilittle14 小时前
XDP to TC : TUN eBPF NAT
c++
x_xbx15 小时前
LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
花开莫与流年错_15 小时前
ZeroMQ基本示例使用
c++·消息队列·mq·示例·zeromq