生活中的ISBN码和身份证号码的校验

来源:互联网 发布:java与javascript区别 编辑:程序博客网 时间:2024/06/01 18:53

ISBN码

ISBN码是国际标准书号,出现在我们购买的图书后面,加上校验码一共有13位,其校验码的生成策略如下:

用1分别乘书号的前12位中的奇数位,用3乘以偶数位 ;
(2) 将各乘积相加,求出总和 ;
(3) 将总和除以10,得出余数 ;
(4) 将 10 减 去 余 数 后 即 为 校验位 。 如 相 减 后 的 数 值 为 10 ,为 校验位则 0 。

如我手边上的《数据库系统概论》的ISBN码如下:

978 - 7 - 04 - 040664 - 1

说明:

  • 第一组固定为978或979;
  • 第二组表示国家代码,如7表示中国
  • 第三组为出版社代码,如04表示高等教育出版社
  • 第四组为该图书的编号
  • 最后一组就是校验位

我们按照上面对的方法计算一次看看:

奇数位依次是:9 8 0 0 0 6
偶数为依次是:7 7 4 4 6 4

奇数为*1+偶数*3 = 23 + 96 = 119
119 % 10 = 9
10 - 9 = 1
故,我们得到校验位为: 1

代码描述如下:

import java.util.Scanner;public class TestOne {    public static void main(String[] args) {        Scanner jin=new Scanner(System.in);        int a[] =new int[12];        int sum=0;        for(int i=0;i<12;i++){            a[i]=jin.nextInt();            if((i+1)%2==0){                sum+=a[i]*3;            }else{                sum+=a[i]*1;            }        }        System.out.println("校验位为:"+(10-(sum%10)));    }}

身份证号码

现在先给出一个不包含校验位的17位身份证号码

21070319840807301

现在我们怎样求出这个身份证号码的校验位呢?

首先对前17位进行加权求和:
假设我们前17位存放在数组a[i]中。
假设权重存放在数组w[i]中,则权重对的值为218(i+1)mod11
我们把i=0到 i=16依次计算得到的权重的值为:

7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

计算公式:

S=i=1na[i]w[i]mod11

根据上面计算公式计算得到S=274

然后我们将S%11得到T=S%11=10

最后根据我们得到的T的值去查找校验码:

T值 0 1 2 3 4 5 6 7 8 9 10 校验码 1 0 X 9 8 7 6 5 4 3 2

故可以得到校验码为 2
代码描述:

import java.util.Scanner;public class TestOne {    public static void main(String[] args) {        Scanner jin=new Scanner(System.in);        int a[] =new int[17];        int w[] ={7,9,10,5,8,4,2,1,6,3, 7, 9, 10, 5, 8, 4, 2};        char c[]={'1','0','X','9','8','7','6','5','4','3','2'};        int sum=0;        for(int i=0;i<17;i++){            a[i]=jin.nextInt();            sum+=a[i]*w[i];            //sum+=a[i]*(Math.pow(2, 18-(i+1))%11); 也可        }        int t=sum%11;        System.out.println("校验位为:"+c[t]);    }}

最后

明天考试加油!O(∩_∩)O哈哈~