Python实例—计算ISBN的校验和并返回ISBN号

咳咳,科普一下,ISBN的中文名为国际标准书号,简单来说就是一本书的身份证,经常和条形码在一起使用。

话不多说,我们直接进入正题:
一、题目要求与分析
  国际标准书号用10为数字唯一标识一本书(哈哈,莫说我骗你噻,自从2007年1月1日起,实行新版ISBN,即在原来的10位数字前加上3位图书产品代码“978”,称为欧洲商品编号,总之就是方便检索的,这段很尴尬,隐了隐了),最右边的数字为校验和,可由其他9位数字计算出来,且d1 + 2d2 + 3d3 + …+ 10d10 必须是11的倍数。校验和必须是介于0到10中的一个数字,用X标识10。例如:020131452的校验和是5,因为对于下边11倍数的公式,5是唯一的介于0到10之间的数:

要求任意给出前9位数字,需要计算校验和并返回ISBN号。

好吧,不得不说我在构建这个数学公式上耗费了大半元气。
  题目分析:上边啰嗦了那么多,终归是一个找数字的问题,只是这个数字比较复杂,既满足在0-10之间,又满足和其他数相加是11的倍数。如果这个数找到了,那么什么输出ISBN号通通不在话下,我们将问题简化可以分解成以下三步:
   步骤1: 限定校验和k(就是那个数,我们也专业点儿)的范围为0-10
   步骤2: 计算其他数(就是那个 2d2 + 3d3 + …+ 10d10),这里用number_other表示;
   步骤3: 限定倍数(就是相加是11的倍数那个倍数),这里用mul表示.
注意:我为什么要限定倍数nul 呢?
   这个问题是这道题的核心,这里我不妨谈谈自己的思路,题中提到11的倍数,但又没有说这个倍数具体是多少,所以我只能用一个变量mul来代替,让它从0往后遍历就好了,但是新的问题出现了;这么一直遍历下去也不是办法,毕竟刹不住车不行呀。
   所以这里的问题又转化成了找最大倍数的问题,怎么找最大倍数呢?不妨看一下这个公式:

这样就一目了然了,对吧!k增大mul增大,所以很容易求出来mul的最大值是45,如果mul超出这个值,则k就不能落在0-10之间了。

讲到这里,想必后边的代码过程大家都势如破竹了,接下来我们把代码给码列一下……


二、源代码部分

def ISBN(n):number = str(n)number_other = 0j = 2for i in range(-1,-10,-1): number_other +=  eval(number[i]) * jj += 1for mul in range(0,45):       #找m可能取到的最大值for k in range(0,11):if (number_other + k) / 11 == mul:        #我滴天,千万不能用整除if 0 <= k <=9:d = str(k)if k == 10:d = "x"trueISBN = number + dreturn (trueISBN)for num in [201314525, 488888913, 977889994, 753231846, 701134069]:trueISBN = ISBN(num)print(trueISBN)

嗯,中规中矩的代码,不掺任何浮躁华丽……
三、结构分析
(1) 制造一个函数模块
  害,这种类型的难题不编写一个函数总觉得对不起自己,一方面是为了养成一个好的习惯,毕竟模块化处理嘛,方便以后干惊天动地的事,另一方面也看起来舒心,简洁整齐,有条不紊,多像正规军。

  注意:函数的参数一定要传递正确,要不然浪过头就不好了。
(2) 计算num_other
  num_other也不是不好算,只是大家有没有发现那个公式里数字的计算方式是倒着的,比如020131452(图也给你了,快看看),所以你要么倒着让它每个数进行乘法运算,要么就是让他每个数乘以一个倒着增长的数。

我这里选择了前者,这里涉及字符串的索引问题,你要是不懂的话可以看看我的“Python字符串的索引”
于是乎,产生了如下一段代码:

 number = str(n)number_other = 0j = 2for i in range(-1,-10,-1): number_other +=  eval(number[i]) * jj += 1

  注意:j的值要从2开始,因为乘1被校验和k(文章一开始提到的那个数)占了
(3) 计算核心数字k
  通过一开始我们的分析,可以知道要进行两次限定,于是这里就用了两个for循环,第一个循环限定mul的值最大为45(为啥写46就不必说了哈,range函数的特性嘛对不对),第二次限定k的范围为0-10, 所以这个计算核心数字k的过程就悄然跃然纸上:

    for mul in range(0,46):       #找m可能取到的最大值for k in range(0,11):if (number_other + k) / 11 == mul:        #我滴天,千万不能用整除if 0 <= k <=9:d = str(k)if k == 10:d = "x"trueISBN = number + d

  注意:
  1 . 因为题中说“用X标识10”,所以记得加一个判断,判定k是不是10,如果是的话就用X代替;
  2 . 公式描述的那个部分千万不能用整除,“/”和“//”是有区别的,整除的话在这里会使很大一部分数都满足条件,仔细想想?
   3 . 函数的最后要写return,要不前面写的都白搭了。切记切记。

四、本次的运行结果

那就在这里祝你好运咯~


听说,爱学习的人都特帅……

Python实例——国际标准书号(ISBN)的计算相关推荐

  1. 编程练习 P124 6.2 java国际标准书号ISBN是由13位数字组成,分为5段,如978-7-111-50690-4是一个合法的书号。编写程序,用户输入一个字符串书号,检查该书号是否合法。

    import java.util.Scanner;public class ISBNValidator {public static void main(String[] args) {Scanner ...

  2. ISBN是国际标准书号的简称,10位ISBN的最后一位为校验位python

    ISBN是国际标准书号的简称,10位ISBN的最后一位为校验位(由前9位计算得到),校验方法为,前9位数字从左到右分别与10到2相乘,然后求和,得到的和再对11进行整除,得到余数(即对11进行取模运算 ...

  3. 用matlab水和水蒸汽热力性质,新的水和水蒸汽热力性质国际标准IAPWS—IF97及计算软件...

    0引言1967年国际公式化委员会通过IFC67水和水蒸汽热力性质计算公式后,该公式迅速得到了国际电力界的认可和广泛使用.在我国该公式已广泛用于汽轮机锅炉设计,电厂热力系统循环计算,性能试验等涉及到水和 ...

  4. Python实例9:基本数据统计值计算

    Python实例9:基本数据统计值计算 需求:给出一组数,对它们有个概要理解: 总个数:len() 求和:for ... in 平均值:求和/总个数 方差:各数据与平均数差的平方的和的平均数 中位数: ...

  5. 国际标准书号 (International Standard Book Number, ISBN)是专门为识别图书等文献而设计的国际编号

    下面是某校2021届转专业计算机科学与工程学院笔试试题. ISBN是由13位数字组成,最后一位是校验码.如图,校验码的计算方法是:用1分别乘ISBN的前12位中的奇数位(从左边开始数起),用3分别乘以 ...

  6. 【Python】国际标准情商EQ测试

    上一节: <<[Python Socket编程之聊天机器人(源码)>> 最近有点忙,没有及时更新多多见谅.今天教大家用代码玩玩小测试.最下方有""彩蛋&qu ...

  7. python认证国际标准_Python Matplotlib.colors.LogNorm用法及代码示例

    Matplotlib是Python中令人惊叹的可视化库,用于数组的二维图. Matplotlib是一个基于NumPy数组的多平台数据可视化库,旨在与更广泛的SciPy堆栈配合使用. matplotli ...

  8. python实现非标准正态分布下概率密度有关计算

    总目录:Python数据分析整理 之后马上要学习朴素贝叶斯算法了,为之后的学习做好铺垫,重新用python实现了一下数据正态性的检验.根据数据的均值方差,求出小于某个值的概率,或者根据概率求出这个值是 ...

  9. 由13位数字组成的中国标准书号校验码计算实例

    由13位数字组成的中国标准书号校验码计算实例 EAN·UCC 前缀 组区号 出版者号 出版序号 校 验 码 1 取ISBN前12位数字 9 7 8 7 5 0 6 4 2 5 9 5 ? 2 取各位数 ...

  10. python计算样本方差_Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算...

    使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差的计算. variance: 方差 方差(Variance)是概率论中最基础的概念之一, ...

最新文章

  1. /etc/hosts/中HOSTNAME错误导致lsnrctl启动错误
  2. 如何利用竞价的思维去做seo?
  3. Erdaicms旅游网站系统微信和手机端分销系统正式上线发布啦
  4. WINCE6.0更换桌面壁纸和图标
  5. 大数据谋定农业发展路径-丰收节贸易会:全球十大经典案例
  6. java 实现动画_java编程加载窗口,实现动画
  7. 信息安全系统第十三周学习总结 20135218 姬梦馨
  8. SilverLight开发系列第1步:搭建开发环境
  9. Please, commit your changes or stash them before you can merge.
  10. python---python基本算法的时间复杂度和空间复杂度
  11. blender 建模记录
  12. [产品]博客文章被企业群组收录的方法
  13. GL/gl.h: No such file or directory
  14. uniapp css实现轮播图片逐渐放大效果
  15. 血氧心率测量仪(带温湿度测量功能)OLED显示
  16. stroage——SAN存储与WINDOWS主机连接
  17. iphone长截图哪个软件好_亲身体验过13款滚动截屏App,谁才是最好用的iPhone长截屏工具?...
  18. 图灵Java架构师学习路线图
  19. java基础----(三大特性:封装,继承,多态)
  20. layui tabel筛选列 记忆功能

热门文章

  1. 科普 | 天才在左,疯子在右
  2. 「数商云专辑」服装/服饰电商平台解决方案
  3. Android 集成google地图 准备工作
  4. VBA中启动其它程序
  5. CTF.show:misc入门24-49
  6. 关于http响应200 OK的问题
  7. 使用Python及SMTP协议发送邮件(以163邮箱为例)
  8. 2022年个人如何申请微信H5支付接口?
  9. 刷机!刷机!!刷机!!!
  10. 2020.10.25丨全长转录组结构分析之可变剪切、lncRNA预测