算法
令身份证号码的每一位和与之对应的位权值(从左到右分别对应 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2)相乘,得到17个乘积求和,得到的和对11取余,与余数对应的符号便是身份证号第18位(余数按0~10的顺序分别对应 1 0 X 9 8 7 6 5 4 3 2)
在Linux中用C语言实现
进入vi编辑器编辑源代码,我把文件命名为 chkID.c
vi chkID.c
按下 i 键,来输入代码
#include <stdio.h>
void main(){
int CHK[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}, MOD, END, i, SUM=0;
char ID[18];
//存储17位的字符串需要18个字符型单元,最后一位存储结束符\0
//ID字符数组存储身份证号,CHK数组存储每位的加权因子,END保存最后计算出的身份证尾号
printf("输入你的身份证号的前17位: "); scanf("%s", ID);
printf("你的身份证号前17位是: "); printf("%s\n", ID);
printf("每一位的加权因子为: %d", CHK[0]); for(i=1; i<=16; i++)printf(",%d", CHK[i]); printf("\n");
for(i=0; i<=16; i++)SUM+=(ID[i]-48)*CHK[i]; MOD=SUM%11;
//字符型数字转化为整型需要减48
//身份证号前17位每一位与对应的加权因子相乘后求和,求出的和对11取余得到模,根据模,对应得到末尾的校验码
switch(MOD){
case 0:END=1;break; case 1:END=0;break; case 2:END=10;break; case 3:END=9;break;
case 4:END=8;break; case 5:END=7;break; case 6:END=6;break; case 7:END=5;break;
case 8:END=4;break; case 9:END=3;break; case 10:END=2;break;
}
printf("身份证号的最后一位为: "); if(MOD==10)printf("X\n");else printf("%d\n", END);
}
按下 Esc 键,输入 :wq 保存文件并退出
使用gcc进行编译,-o参数用来指定生成程序的名字
gcc chkID.c -o chkID
运行程序
./chkID
用Bash实现
同上进入vi编辑代码,我把文件命名为 chkID.sh ,代码如下
#!/bin/bash
read -p "Enter the first 17 digits of your ID number: " ID
CHK=(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) #数组
echo "The first 17 digits of your ID number are $ID"
echo "The power of every digit is ${CHK[*]}" #输出数组全部元素
SUM=0
for i in {0..16} ; do #计数循环
let SUM=$SUM+${ID:i:1}*${CHK[i]} #当变量作为索引值时前面可不加$
done
let MOD=SUM%11
echo -en "The last digit of your ID number is "
case $MOD in
0) echo "1";; 1) echo "0";; 2) echo "X";; 3) echo "9";;
4) echo "8";; 5) echo "7";; 6) echo "6";; 7) echo "5";;
8) echo "4";; 9) echo "3";; 10) echo "2";;
esac
运行程序
bash chkID.sh