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

相关推荐
悲伤小伞2 小时前
Linux_应用层自定义协议与序列化——网络计算器
linux·服务器·c语言·c++·ubuntu
hans汉斯2 小时前
基于联邦学习的隐私保护和抗投毒攻击方法研究
网络·人工智能·算法·yolo·数据挖掘·聚类·汉斯出版社
!停2 小时前
数据结构二叉树—链式结构(中)
java·数据结构·算法
回敲代码的猴子2 小时前
2月12日打卡
人工智能·算法
We་ct2 小时前
LeetCode 138. 随机链表的复制:两种最优解法详解
前端·算法·leetcode·链表·typescript
llz_1122 小时前
蓝桥杯备赛-搜索(DFS/BFS)
c++·算法·蓝桥杯·深度优先·宽度优先
山顶夕景2 小时前
【Math】数学知识点串联
人工智能·数学·算法·机器学习
Hag_202 小时前
LeetCode Hot100 42.接雨水
算法·leetcode·职场和发展