ISBN注解

ISBN号码暴力解法-(新手Flyfly_070323) 普及- 题目来源: (1)信息学奥赛课课通(C++) (2)洛谷 P1055 *HTML https://www.luogu.org 题目描述: 每一本正式出版的图书都有一个ISBN号码与之对应。 ISBN1码包括99位数字、11位识别码和33位分隔符。 其规定格式如 x-xxx-xxxxx-x,其中符号- 就是分隔符(键盘上的减号)。 最后一位是识别码,例如 0-670-82162-4 ... 阅读详情

这段代码看起来是在尝试解决经典的 “ISBN 号码验证” 问题(例如洛谷上的 P1055)。代码的整体思路是对的(提取数字、计算校验码、取模对比),但在语法和逻辑细节上有几个明显的错误,会导致编译失败或结果错误。

以下是代码中存在的主要问题及修复建议:

1. 语法错误:main 函数的返回值

在 C++ 中,main 函数的标准返回值必须是 int,且通常在正常结束时 return 0;。

  • return right; 会导致编译报错,因为 right 并没有被定义为一个变量(即便意图是输出字符串 "Right")。

  • return false; 虽然可以编译(false 会被隐式转换为 0),但不符合通常的输入输出要求。这类题目通常要求使用 cout 打印出结果,而不是通过 main 的返回值来体现。

2. 逻辑错误:字符的 ASCII 码 vs 实际数值

当你执行 (int)hao[i] 时,你获取的是字符的 ASCII 码(例如字符 '1' 的 ASCII 码是 49),而不是数字 1。

  • 修改方法:需要减去字符 '0' 的 ASCII 码,即 hao[i] - '0',才能得到真正的数值。

3. 逻辑错误:校验码的计算规则

当前的循环里只是把每个数字简单相加:code += (int)hao[i];。

但标准的 ISBN 校验位计算规则是:第1个数字×1 + 第2个数字×2 + ... + 第9个数字×9。你需要一个额外的变量来记录当前是第几个数字。

4. 逻辑错误:处理校验位 'X'

除以 11 的余数如果是 10,标准规定校验位应该用大写字母 'X' 表示。代码中直接将 code % 11 和 (int)hao[n-1] 比较是无法正确处理 'X' 的。

修改后的正确代码

以下是修复上述问题后的完整代码,并添加了注释以帮助理解:

C++

#include <iostream>
#include <string>
using namespace std;

int main() {
    string hao;
    cin >> hao;
    
    int n = hao.size();
    int code = 0;
    int j = 1; // 用于记录当前是第几个数字(乘数从 1 到 9)
    
    // 遍历前面的字符,计算校验和
    for (int i = 0; i < n - 1; i++) {
        if (hao[i] != '-') {
            // 将字符转换为数字,并乘以对应的权重 j
            code += (hao[i] - '0') * j;
            j++;
        }
    }
    
    int mod = code % 11;
    char expected_last; // 期望的最后一位字符
    
    // 如果余数是 10,校验位是 'X',否则是对应的数字字符
    if (mod == 10) {
        expected_last = 'X';
    } else {
        expected_last = mod + '0'; // 将数字转换回字符
    }
    
    // 比较实际的最后一位和期望的最后一位
    if (hao[n - 1] == expected_last) {
        cout << "Right" << endl;
    } else {
        // 如果错误,题目通常要求输出正确的 ISBN 号
        hao[n - 1] = expected_last;
        cout << hao << endl;
    }
    
    return 0;
}

核心改进点总结:

  1. 引入了 j 变量来实现递增的乘法权重。

  2. 使用了 -'0' 和 +'0' 在字符和数字之间进行正确的转换。

  3. 单独处理了余数为 10 时转换为 'X' 的特殊情况。

  4. 使用 cout 输出结果,而不是使用非法的 return right;。

AHB总线协议 1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内 阅读详情

相关推荐

DDR ECC错误注入与寄存器配置实战指南

本文详细介绍了DDR ECC错误注入的核心价值与实战操作指南,包括通过FI_Dx和FI_ECC寄存器注入数据与ECC错误的方法。文章提供了环境准备、寄存器配置、错误检测及系统可靠性测试策略,帮助开发者验证内存系统的纠错能力和可靠性,提升硬件开发的稳定性与效率。

nnn11的博客 1104

Hibernate Validator 第8篇:另外的约束一(内供)

本文讲除了Bean Validaiton API定义的约束之外,Hibernate Validator自己另外提供的约束。这些约束中大部分可以应用在域值/属性上,只有@ScriptAssert是一个类级别的约束。

顽木芽的博客 453

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

CCF-ISBN号码(Python)--含详细注释

CCF-ISBN号码(Python)–含详细注释 Python代码如下: # join() 方法用于将序列中的元素以指定的字符&amp;lt;连接&amp;gt;生成一个新的字符串 # split() 通过指定分隔符对&quot;字符串&quot;进行&amp;lt;切片&amp;gt; a = input() b = a.split('-') c = ''.join(b) d = 0 count = 0 while co

weixin_42238674的博客 2354

TriCore架构-基于TC397的启动流程

TC397芯片的启动流程分为三个关键阶段:固件启动(BootFirmware)、Bootloader引导和应用程序启动。BootFirmware作为硬件信任根,包含SSW基础初始化、CHSW自检和BSL应急刷写通道。Bootloader承担安全验证和程序引导功能,支持双分区(AB-SWAP)和双引导方案(PBL/SBL)。安全启动通过校验机制确保软件完整性,提供三种可选技术方案。应用程序启动阶段实现软件双分区管理,支持SOTA更新。整个流程体现了汽车电子系统的安全设计理念,通过硬件级保护与软件验证相结合确保

xiandang8023的博客 987

STM32G431的 FDCAN使用5M加速时,出现奇葩问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1636

【译】MVC3 20个秘方-(3)验证用户的输入

场景你要确保你的表单捕获的数据包含你预期的数据,这些数据是基于你的数据库或模型设计。 解决方案 .NET 4.0 包含了一个新的数据注解命名空间,提供了一些有用的元数据属性类。这些类已经被应用到MVC3。 对于验证表单输入,下面的属性类可以用来提供各种各样验证选项:RequiredAttribute,RegularExpressionAttribute,RangeAttribute...

194

UE5接入在线直播视频源,如hls(m3u8)格式

UE5接入在线直播视频源

专注GIS开发 9499

(3)验证用户的输入

场景 你要确保你的表单捕获的数据包含你预期的数据,这些数据是基于你的数据库或模型设计。 解决方案 .NET 4.0 包含了一个新的数据注解命名空间,提供了一些有用的元数据属性类。这些类已经被应用到MVC3。 对于验证表单输入,下面的属性类可以用来提供各种各样 验证选项:RequiredAttribute,RegularExpressionAttribute,RangeAttribute和 D

Lin&Yi的专栏 395

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

【异常】Cursor导入Karpathy指南失败解决方案Failed to import GitHub/GitLab rules: Error executing git: Cloning into

摘要:本文解决了Git克隆单个文件报错的问题,指出git clone只能克隆整个仓库而非单个文件。提供了两种解决方案:1) 推荐手动创建规则文件,在Cursor项目中新建.mdc文件并粘贴Karpathy行为指南完整内容;2) 备选克隆整个仓库获取文件。指南包含编码行为规范,强调简单性、精准修改和明确目标。还说明了如何设置全局规则和即时生效的方法。

奶爸的编程之路,也就一周冷个三天 174

Spring Boot – 自定义PropertyEditor

前言 PropertyEditor最初是属于Java Bean规范定义的,有意思的是,Spring也大规模的使用了PropertyEditors,以便实现以各种形式展现对象的属性; 举个例子,常见的用于解析Http请求参数,通常需要在展现层把原始Java对象解析成对人友好的参数,这时候就经常需要用到自定义PropertyEditor; 在org.springframework.beans.pro...

疯一样的码农 156

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】

在进行Sample导入或Git项目Clone时,遇到连接超时问题是一个常见而令人烦扰的情况。连接超时问题通常源于网络限制,可能是由于防火墙、代理设置或其他网络配置导致。因此,首先要关注网络状态,确保网络通畅。如果在网络受限的情况下,代理服务器配置是一个有效的解决方案。通过在Git全局配置中设置代理信息,可以将网络请求通过代理服务器传输,规避一些网络限制。但在使用代理时,需要确保代理服务器的可用性和稳定性,以免引入新的问题。

一键难忘的博客 4557

propertyeditor java_Spring Boot项目中如何定制PropertyEditors

在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据,实际上,在一次请求的完成过程中还发生了其他的转换,我们这次关注将参数转换成多种类型的对象,如:字符串转换成Date对象或字符串转换成Integer对象。在编写控制器中的action方法时,Spring允许我们使用具体的数据类型定义函数签名,这是通过PropertyEditor实现的。Pr...

weixin_33148621的博客 168

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring Boot:定制PropertyEditors

在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据,实际 上,在一次请求的完成过程中还发生了其他的转换,我们这次关注将参数转换成多种类型的对象,如:字符串转换 成Date对象或字符串转换成Integer对象。 在编写控制器中的action方法时,Spring允许我们使用具体的数据类型定义函数签名,这是通过 PropertyEdito...

DQchat的博客 584

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

propertyeditor java_Spring Boot项目中定制PropertyEditors方法

在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据,实际上,在一次请求的完成过程中还发生了其他的转换,我们这次关注将参数转换成多种类型的对象,如:字符串转换成Date对象或字符串转换成Integer对象。在编写控制器中的action方法时,Spring允许我们使用具体的数据类型定义函数签名,这是通过PropertyEditor实现的。Pr...

weixin_36173940的博客 119

图书管理系统的

这个 Book 类定义了一个图书实体,包括了 id、标题、作者、ISBN 号和出版年份等属性。在这里,@Entity 注解用于标识这是一个 JPA 实体类,@Id 和 @GeneratedValue 注解用于定义主键和主键生成策略。

2201_75928097的博客 130

深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】

前言 关于Bean Validation的基本原理篇完结之后,接下来就是小伙伴最为关心的干货:使用篇。 如果说是数据校验最基本的使用,我十分相信小伙伴们都能够使用,但是有个前提:Spring MVC。我大概的调查了一下,几乎100%的人都是使用在Spring MVC的Controller层面的,而且几乎90%的人都是让它必须和@ResponseBody一起来使用去校验JavaBean入参~ 熟悉我...

架构师:通透,才能写出好代码! 8063

洛谷p1055 ISBN号码(C语言)

【代码】洛谷p1055 ISBN号码(C语言)

handsomezqh的博客 796

java基础概念67-注解annotation

注解的作用,格式;内置注解;注解的生命周期;元注解;常用注解;自定义注解;注解的用处:反射、类的加载过程,类的初始化,类加载器,使用反射动态加载对象;通过反射获取泛型,注解

qq_31532983的博客 856

bean通过注解实现字段校验

参数校验是我们程序开发中必不可少的过程。用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验。后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观。 那么如何...

xuanwugang的博客 1万+

@valid数据校验注解的使用

Java Bean Validation 最佳实践 参数校验是我们程序开发中必不可少的过程。用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验。后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方...

学不死的程序员 1万+

Spring缓存注解入门

性能缓慢是开发人员经常面临的一个反复出现的复杂问题,解决此类问题的最常见方法之一就是利用缓存,不过,处理缓存并不是一个容易的事情。幸运的是,自 3.1 版本开始,Spring 引入了对 Cache 的支持。其使用方法和原理都类似于 Spring 对事务管理的支持。接下来我们了解一下如何基于注解的方式来使用 Spring 的 Cache。

shxguozhq的博客 147

揭开 Java 注解“@” 符号的神秘面纱

在了解Java注解的作用后,我们是不是可以自定义注解呢?自定义注解是Java中非常强大的一项高级功能,也是所有大型框架(比如Spring、MyBatis)能够实现“魔法”的基础。学会了自定义注解,你就从一个框架的“使用者”,开始迈向了“理解者”甚至“设计者”的第一步。下面,我们就来一步步学习如何定义和使用一个属于你自己的注解。定义一个注解,语法上和定义一个接口(interface)非常相似,只是把interface关键字换成了@interface。定义好之后,我们就可以像使用其他注解一样,在代码里使用它了。

2301_80318532的博客 950

@Transactional注解中事务的传播行为总结

@Transactional注解中事务的传播行为总结 在事务的注解@Transactional中的propagation字段定义了事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。 @Transactional public void mulTx() {//这个事务嵌套了两个小事务 ...

u012045045的博客 1149
上一篇: auto用法
下一篇: 二分查找。
Ghost_Shellrrr
博客等级 码龄3年 72粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值