首页 > 编程知识 正文

洛谷P1055 ISBN号码题解,洛谷黑题号码

时间:2023-05-06 15:13:01 阅读:258120 作者:1655

这道题算是比较直白简单,但依旧没有一次ac,伴随着n年的审题问题和躁动的心态。

本题值得注意的还有字符与整形的几次转化,可以注意一下转化的格式!

    我们如果对c语言里数据是如何存储的不清楚的话,就会导致我们对程序的理解越来越困难。说白了c语言就是人与机器交流的一种规则,而机器和芯片能明白的只能是0和1这两种高低电平。他们什么也不懂。只是一堆模拟电子和数字电路板集合。那人们怎么会操作这些破玩意儿呢?刚开始人们真的是010101的通过打孔来操作的。后来,人们学聪明了有了汇编又有了c语言、c++、java等等工具。其实每一个语言体系只是一些操作机器的规则而已。你遵守了这个规则就会成为编程忧虑的冰淇淋。


    计算机中的字符包括数值、英文字母、标点符号、制表符号及其他符号。每一个字符都用一个特定的二进制代码来表示,这就是字符的编码。目前,字符编码采用的是美国信息交换标准代码,即ASCII 码 。它是用一个字节的低七位来表示一个字符的编码, 2^7 =128 ,最高位是 0 ,所以,用 ASCII 码可表示 128 个字符)。有了这个我们就不怕我们输入的字符,计算机不懂了。于是只要我们自己在程序中输入一个字符(例如:‘a’)计算机在编译过程中自动将它转换成97的二进制码,这就是为什么说字符本质上也是整型了,因为字符变量只是告诉计算机,我这个数据只占一个字节,也就是说我超不出128这个数去。而int则告诉我这个数可能很大,有65534那么大呢。

  下面就说说为什么字符减'0'可以到相应的整数。现在比如我们要字符‘1’转换成数字1,就这么一个变化,我们看到了大家注意了字符型常量用''括起来的原因是,它们在计算机中都以各自的ASCII表示。而‘1’的对应编码是49的二进制码,但是我们的数字1,就等于1呀,所以为了由原来的‘1’实际上就是49的二进制变成现在的1对应的二进制1,只好用49-48=1了。但是在ASCII码里‘0’对应的刚好是48的二进制码,所以我们转换的时候只需要‘1’-‘0’=1;就可以了。而数字的ASCII码是按顺序规定的。所以其它字符要转换成数字都可以用减‘0’来表示。比如‘2’的ASCII是50,而我们要得到数字2,于是用‘2’-48=2了。看来当我们知道数据在计算机中的存储规则的时候,问题就迎刃而解了。

     大小写字母的转换:先看ASCII码:a~z是97~122的二进制,而A~Z是65~90的二进制编码,于是我们就得出:大写字母=小写字母-32 ;这个公式了。当然这里的32我也可以这么写‘Z’=‘z’-'空格'。因为空格的ASCII码是32对应的二进制编码。
 

题目描述

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括999位数字、111位识别码和333位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如000代表英语;第一个分隔符-之后的三位数字代表出版社,例如670670670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以111加上次位数字乘以222……以此类推,用所得的结果mod11 bmod 11mod11,所得的余数即为识别码,如果余数为101010,则识别码为大写字母XXX。例如ISBN号码0-670-82162-4中的识别码444是这样得到的:对067082162这999个数字,从左至右,分别乘以1,2,...,91,2,...,91,2,...,9再求和,即0×1+6×2+……+2×9=1580×1+6×2+……+2×9=1580×1+6×2+……+2×9=158,然后取158mod11158 bmod 11158mod11的结果444作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。

输入输出格式

输入格式:

 

一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

 

输出格式:

 

一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。

 

输入输出样例

输入样例#1: 复制

0-670-82162-4

输出样例#1: 复制

Right

输入样例#2: 复制

0-670-82162-0

输出样例#2: 复制

0-670-82162-4 说明

2008普及组第一题

 

首先是我的50分代码

#include <iostream>#include<stdio.h>using namespace std;char ss[20],aa[15];int j=0,sum=0,ans1,ans2; //ans1识别码 ans2实际计算值int main(){ gets(ss); ans1=int(ss[12]-'0');for(int i=0;i<=10;i++) { if(i==1||i==5) continue; else { aa[j]=ss[i]; j++; } }for(int i=0;i<=8;i++) { int b=i+1;int c=int(aa[i]-'0'); sum+=c*b; }ans2=sum%11;if(ans1==ans2) { printf("Right"); } else { ss[12]=char(ans2+'0'); puts(ss); } return 0;}

没有注意X,但这里的解决方式非常简单,就是加一个判断 应该这是唯一的特殊情况,简单的加一个判断就很方便得解决了。

100分代码

#include <iostream>#include<stdio.h>using namespace std;char ss[20],aa[15];int j=0,sum=0,ans1,ans2; //ans1识别码 ans2实际计算值int main(){ gets(ss); if(ss[12]=='X') { ans1=10; } else ans1=int(ss[12]-'0'); for(int i=0;i<=10;i++) { if(i==1||i==5) continue; else { aa[j]=ss[i]; j++; } } for(int i=0;i<=8;i++) { int b=i+1;int c=int(aa[i]-'0'); sum+=c*b; } ans2=sum%11; if(ans1==ans2) { printf("Right"); } else { if(ans2==10) { ss[12]='X'; } else ss[12]=char(ans2+'0'); puts(ss); } return 0;}

 

下面是反思:

今后对待竞赛题,确保三次逐字审题,再开始写代码。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。