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往后遍历就好了,但是新的问题出现了;这么一直遍历下去也不是办法,毕竟刹不住车不行呀。