专栏文章
题解:UVA333 Recognizing Good ISBNs
UVA333题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipg7lvg
- 此快照首次捕获于
- 2025/12/03 11:29 3 个月前
- 此快照最后确认于
- 2025/12/03 11:29 3 个月前
Part-1 浅解析 ISBN 字符串
这一阶段,无论 ISBN 号码是否正确,都不需要处理。只需要处理两端的空格。
思路,双指针获取两端空格的位置:
CPP思路,双指针获取两端空格的位置:
int ResR,ResL;
for(L:First->Last)
{
if(ISBN[L]!=' ')
{
ResL=L-1;
break;
}
}
for(R:Last->First)
{
if(ISBN[R]!=' ')
{
ResR=R+1;
ISBN[ResR]='\0';//直接将此处作为整个字符串的结尾
break;
}
}
sprintf(ISBN+ResL,"%s",Tmp);//将截取好的字符串直接复制给下一步骤的字符串,输出 Tmp,然后进行下一步即可。
Part-2 深解析 ISBN 字符串
可以去看看题库中的题目:NOIP2008-ISBN 号码
这是我的通过代码,可以嵌套在主程序中(最好用函数)。(这不是完整的判断程序)
思路:先将计数器初始化为 ,然后乘数设为 。接着跳过分隔符,
CPPsum 加上 mul 与该数的积,最后判断最后一个校验码是否正确。#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
char ISBN[1000];
int mul=1,sum=0;
int main()
{
scanf("%s",ISBN+1);
for(int index=1;index<=11;index++)
{
if(ISBN[index]=='-')
{
continue;//跳过分隔符
}
else
{
sum+=mul*(ISBN[index]-48);//算积的和
mul++;
}
}
sum%=11;
//判断
if(ISBN[13]==sum+48||ISBN[13]=='X'&&sum%11==10)
{
printf("Right");
}
else
{
for(int index=1;index<=12;index++)
{
printf("%c",ISBN[index]);
}
if(sum<10)printf("%d",sum);
if(sum==10)printf("X");
}
return 0;
}
当然,题目中有条件:
X(如果 ISBN 正确的话)有可能且仅可能在最后一位,其他位置都算incorrect。-是正确 ISBN 的分隔符,而_不是,所以要特判分割符的位置。
UPD 思路:Regex。由于正确的 ISBN 是长这样的:(用
X 表示数字或 X)X-XXX-XXXXX-X,那么有以下思路(目前实验中):(将这里的 X 换成 \d)- 使用 Python/C++ 中的正则表达式,匹配
X-XXX-XXXXX-X,看是否可以匹配成功。 - 如果成功,那么使用分割组,然后获取每个分割组,照上面的代码判断,成功输出
correct。 - 否则(或者判断为不成功)输出
incorrect。
Part-3 完结
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...