洛谷P1055-ISBN号码问题总结

该程序设计问题涉及ISBN号码的验证,主要检查识别码是否正确。根据输入的9位数字和最后一位字符(可能是X),计算识别码并判断是否与输入相符。若不符,则给出正确的ISBN号码。程序通过C语言实现,使用了scanf函数处理包含分隔符的输入,并根据识别码是X还是数字进行不同的处理。
摘要由CSDN通过智能技术生成

[NOIP2008 普及组] ISBN 号码

1.题目描述

每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 9 9 位数字、 1 1 1 位识别码和 3 3 3 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 0 0 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 670 670 670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码
识别码的计算方法如下:
首位数字乘以 1 1 1 加上次位数字乘以 2 2 2 ……以此类推,用所得的结果 $ \bmod 11$,所得的余数即为识别码,如果余数为 10 10 10,则识别码为大写字母 X X X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 4 4 是这样得到的:对 067082162 9 9 9 个数字,从左至右,分别乘以 1 , 2 , … , 9 1,2,\dots,9 1,2,,9 再求和,即 0 × 1 + 6 × 2 + … … + 2 × 9 = 158 0\times 1+6\times 2+……+2\times 9=158 0×1+6×2+……+2×9=158,然后取 158   m o d   11 158 \bmod 11 158mod11 的结果 4 4 4 作为识别码。
你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。

2.主要解题思路

根据题面的描述,我们可以得知最后一位为字符输入(因为识别码可能会出现X),考虑到输入中含有分隔符,我们采用C语言的scanf函数来输入变量。然后由题意,我们分出以下两种情况来对识别码做一个数据类型的转换:

1).最后一位识别码为X

此时我们将识别码从字符型转换为整型,只需另外设一个整型变量,令它等于10即可。

2).最后一位识别码不为X

这时我们采用以下的方式对识别码进行数据类型的转换:

int judge=(int)ju-'0';

3.代码讲解

#include<iostream>
using namespace std;
int main()
{
    int a,b,c;
    char ju;
    int judge;//识别码转换成整型的数据
    int R=0;//用来判断识别码是否正确
    scanf("%d-%d-%d-%c",&a,&b,&c,&ju);//输入上因为有分隔符‘-’我们采用C语言的scanf函数
    int a1=a,b1=b,c1=c;//这里是将a,b,c的值给保存下来,后面输出要用到。
    int i=9;//这里我们要注意,是从左到右依次乘以1~9的数字,但是我们取余是从最低位取,所以应该是依次乘以9~1的数字。
    int sum=a;
	while(c!=0)
	{
		int p=0;
		p=c%10;
		sum+=p*i;
		c/=10;
		i--;
	}
		while(b!=0)
	{
		int q=0;
		q=b%10;
		sum+=q*i;
		b/=10;
		i--;
	}
	if(ju=='X')//判断识别码是否X
	{
		judge=10;
		if(sum%11==judge)
		{
			R=1;
		}
		if(R==1)
		{
			printf("Right");
		}
		else
		{
			printf("%d-%d-%d-%d",a1,b1,c1,sum%11);
		}
	}
	else
	{
		judge=(int)ju-'0';
		if(sum%11==judge)
		{
			R=1;
		} 
		if(R==1)
		{
			printf("Right");
		}
		else
		{
			if((sum%11)==10)
			{
				printf("%d-%d-%d-X",a1,b1,c1);
			}
			else
			{
				printf("%d-%d-%d-%d",a1,b1,c1,sum%11);
			}
		}
	}
    return 0;
}

易错总结

a.scanf函数输入时会发生错误,容易写成下面的形式

错误形式:

scanf("%d-%d%d%d-%d%d%d%d%d-%c",&a1,&b1,&b2,&b3,&c1,&c2,&c3,&c4,&c5,&judge);

实际上,ISBN里面只有三个%d,正确写法:

scanf("%d-%d-%d-%c",&a,&b,&c,&judge);

b.在取余时,从右往左依次乘以1~9的数字

取余取到的是数字的最低位,而题目要求的是从左往右依次乘以1~9,即从最高位开始取,当然,也可以逆向思维(像代码中那样)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琉璃蓝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值