专栏文章

题解: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 号码 这是我的通过代码,可以嵌套在主程序中(最好用函数)。(这不是完整的判断程序)
思路:先将计数器初始化为 0{0},然后乘数设为 1{1}。接着跳过分隔符,sum 加上 mul 与该数的积,最后判断最后一个校验码是否正确。
CPP
#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;
}
当然,题目中有条件:
  1. X(如果 ISBN 正确的话)有可能且仅可能在最后一位,其他位置都算 incorrect
  2. - 是正确 ISBN 的分隔符,而 _ 不是,所以要特判分割符的位置

UPD 思路:Regex。由于正确的 ISBN 是长这样的:(用 X 表示数字或 XX-XXX-XXXXX-X,那么有以下思路(目前实验中):(将这里的 X 换成 \d
  1. 使用 Python/C++ 中的正则表达式,匹配 X-XXX-XXXXX-X,看是否可以匹配成功。
  2. 如果成功,那么使用分割组,然后获取每个分割组,照上面的代码判断,成功输出 correct
  3. 否则(或者判断为不成功)输出 incorrect

Part-3 完结

撒花,记得点赞。

评论

0 条评论,欢迎与作者交流。

正在加载评论...