C语言和Bash脚本实现身份证号码尾号验证

算法

令身份证号码的每一位和与之对应的位权值(从左到右分别对应 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcy_Knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值