当前位置: 首页 > article >正文

ISBN 号码——蓝桥杯

1.题目描述

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

识别码的计算方法如下:

首位数字乘以 1 加上次位数字乘以 2 …… 以此类推,用所得的结果 mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162这9 个数字,从左至右,分别乘以 1,2,…,9,再求和,即 0×1+6×2+……+2×9=158,然后取 158 mod 11 的结果 4 作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。

输入描述

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

输出描述

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

输入输出样例

示例 1

输入

0-670-82162-4

输出

Right

示例 2

输入

0-670-82162-0

输出

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

2.代码

#include <iostream>
#include<string>
using namespace std;
int main()
{
  string s;
  getline(cin,s);//输入
  int sum=0;
  int j=1;
  for(int i=0;i<=10;i++)//求和
  {
    if(s[i]!='-')
    {
      sum+=(s[i]-'0')*j;
      j++;
    }
  }
  int a=sum%11;//取模
  if(a==10)//如果a=10,要变为‘X’
  {
    a='X';
  }
  else//其他情况下,变为字符串类型,方便后续操作
  {
    a=a+'0';
  }
  if(a==s[12])//判断并输出结果
  {
    cout<<"Right"<<endl;
  }
  else 
  {
    s[12]=a;
    cout<<s<<endl;
  }
  return 0;
}

3.代码解析

输入部分
string s;
getline(cin, s);
  • 使用 getline 从标准输入读取一行字符串,存储到变量 s 中。这允许输入包含空格的字符串,但在这个场景下,输入应该是一个13位的字符串(前12位是数字,第13位是校验码)。

初始化变量
int sum = 0;
int j = 1;
int flag = 1;
  • sum 用于存储加权和。

  • j 用于表示权重,从1开始递增。

计算加权和
for (int i = 0; i <= 10; i++) {
    if (s[i] != '-') {
        sum += (s[i] - '0') * j;
        j++;
    }
}
  • 遍历字符串的前11个字符(索引从0到10)。

  • 如果字符不是 '-',则将其转换为数字(s[i] - '0'),乘以当前权重 j,并累加到 sum 中。

  • 权重 j 每次递增1。

计算校验码

cpp复制

int a = sum % 11;
if (a == 10) {
    a = 'X';
} else {
    a = a + '0';
}
  • 计算加权和 sum 对11取模的结果。

  • 如果结果是10,则校验码为 'X'

  • 否则,将结果转换为字符(a + '0')。

验证校验码
if (a == s[12]) {
    cout << "Right" << endl;
} else {
    s[12] = a;
    cout << s << endl;
}
  • 如果计算出的校验码 a 与输入字符串的第13个字符(索引为12)相同,则输出 "Right"

  • 否则,将计算出的校验码赋值给字符串的第13个字符,并输出修正后的字符串。


 


http://www.kler.cn/a/528016.html

相关文章:

  • 前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局
  • 通过.yml文件创建环境
  • DeepSeek介绍
  • 级数论存在重大错误的原因:中学数学对无穷数列的认识存在重大错误
  • 如何用函数去计算x年x月x日是(C#)
  • Transformer+vit原理分析
  • Java学习教程,从入门到精通,JDBC中WHERE子句的语法知识点及案例代码(107)
  • jstat命令详解
  • 网站快速收录:如何设置robots.txt文件?
  • AI编程:如何编写提示词
  • 【AI编程助手系列】国产AI编程工具 DeepSeek+Cline+VSCode 快速集成
  • 【Linux系统】进程间通信:共享内存
  • pytorch实现长短期记忆网络 (LSTM)
  • 解决AnyConnect开机自启动问题
  • 解读 DeepSeek 关键 RL 算法 GRPO
  • Day51:type()函数
  • 洛谷P4057 [Code+#1] 晨跑
  • 突破性进展!我国成功研制出新型光子毫米波雷达芯片
  • vue2项目(一)
  • HTTP协议和静态web服务器
  • 对比category_encoders库和sklearn库中的OrdinalEncoder
  • 智联出行公司ZSTL以创新模式,助力中国绿色出行发展
  • MySQL数据类型转换应注意什么?
  • STC32通用GPIO中断,库函数配置方式 AI8051U和STC32G已测试没有问题
  • TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估
  • 音标-- 01--音标