【IMA+DeepSeekR1+本地知识库】撰写NOIP2008普及组复赛题解系列
1、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解-优快云博客
2、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T2【排座椅】题解-优快云博客
3、IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解-优快云博客
4、【IMA+DeepSeekR1+本地文件】撰写NOIP2008普及组T4【立体图】题解-优快云博客
一、提问词
请撰写NOIP2008提高组T1【ISBN 号码】题解,要求:
一、从文件“isbn.in”读数据,答案写入文件“isbn.out”。
二、题解至少包括以下几个部分:
1、题目描述
2、解题思路及推理过程
3、实现代码
4、代码说明
二、DeepSeekR1回复
题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,格式为 x-xxx-xxxxx-x
。其中:
- 识别码计算规则:前 9 位数字分别乘以
1, 2, ..., 9
后求和,结果对11
取模。若余数为10
,则识别码为X
,否则为余数本身。4
任务要求验证输入的 ISBN 号码的识别码是否正确,若正确输出 "Right",否则输出正确的 ISBN 号码。4
输入格式 4
输入文件 isbn.in
包含一行字符串,表示 ISBN 号码。4
输出格式 4
输出文件 isbn.out
包含一行:
- 识别码正确时输出 "Right"; 4
- 否则输出正确的 ISBN 号码(含分隔符)。4
解题思路
- 1.提取有效数字:过滤输入字符串中的分隔符
-
,提取前 9 位数字。 - 2.计算识别码:
- 前 9 位数字分别乘以
1, 2, ..., 9
,求和得到total
。 - 计算
total % 11
,余数为10
则识别码为X
,否则为余数的字符形式。4
- 前 9 位数字分别乘以
- 3.对比与输出:
- 若原识别码与计算结果一致,输出 "Right"。 2
- 否则,替换原识别码并输出完整 ISBN。
实现代码
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("isbn.in", "r", stdin);
freopen("isbn.out", "w", stdout);
string s;
cin >> s;
int sum = 0, idx = 1;
// 遍历前 12 个字符(跳过分隔符)
for (int i = 0; i < 12; i++) {
if (s[i] == '-') continue;
sum += (s[i] - '0') * idx;
idx++;
}
// 计算正确的识别码字符[4])
char correct = (sum % 11 == 10) ? 'X' : '0' + sum % 11;
// 比较并输出结果
if (correct == s[12]) {
cout << "Right" << endl;
} else {
s[12] = correct;
cout << s << endl;
}
return 0;
}
代码说明
- 输入处理:直接读取输入字符串,无需分割处理。
- 数字遍历:使用循环遍历前 12 个字符,跳过分隔符
-
,并累加前 9 位数字的加权和。 - 识别码计算:
sum % 11
的余数对应正确校验码,若余数为 10 则记为X
。 4
- 结果输出:
- 若原识别码正确,输出 "Right"。 4
- 否则替换原校验位后输出完整 ISBN。
注意:代码正确处理了分隔符和数字的位置,确保计算结果准确映射到 ISBN 的校验位。
三、说明
1、原回复代码以下两行在测试时不能通过编译
// 比较并输出结果
if (correct == s[12](@ref) {
上述代码经手工修改为
// 比较并输出结果
if (correct == s[12]){
经【Cena】测试通过。