ISO 7064:1983.MOD11-2校验码计算法(身份证18位效验码计算)
·
/*
使用【ISO 7064:1983.MOD 11-2】计算【身份证效验码】
将前面的身份证号码17位数分别乘以不同的系数。
从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
将这17位数字和系数相乘的结果相加
用加出来和除以11,看余数是多少?
余数只能为: 0-1-2-3-4-5-6-7-8-9-10
余数所对应的效验码:1-0-X -9-8-7-6-5-4-3-2
【列如】
余数为7,则对应的效验码为5
【例子】
系数x身份证前17位(单个分开相乘)的和=S
S/11 = S除于11=T...3 (和除于11所得的余数)
3==9(余数对于的效验码)
【公式】
某男性的身份证号码为【53010219200508011?】仅有前17位数字,则不知道最后一位效验码可以这样公式解答:
身份证:5 3 0 1 0 2 1 9 2 0 0 5 0 8 0 1 1
||相乘||
系数: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓ ⇓
积: 35 27 0 5 0 8 2 9 12 0 0 45 0 40 0 4 2
把积数相加所得:189
得出的结果除于11所得:17....2(得17余2)
余数: 0-1-【2】-3-4-5-6-7-8-9-10
余数所对应的效验码:1-0-【X】-9-8-7-6-5-4-3- 2
余数2所对应的效验码为:X
身份证则为【53010219200508011X】可前往【http://ad.0453.com/adxx/shenfenzheng/index.asp】效验身份证是否合法!!
身份证号码由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码,第18位为校验码。
地址码包含(省、市、区)也可通过省、市、区查出地址码!按GB/T2260的规定执行
顺序码(男为奇数、女为偶数)
前1、2位数字表示:所在省份的代码;
第3、4位数字表示:所在城市的代码;
第5、6位数字表示:所在区县的代码;
第7~14位数字表示:出生年、月、日;
第15、16位数字表示:所在地的派出所的代码;
第17位数字表示性别:奇数表示男性,偶数表示女性;
第18位数字是校检码:用来检验身份证的正确性。
*/
#include <stdio.h>
#include <string.h>
int main(void)
{
char InNum[18];
char CheckNum[11] = {'1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'};
int i = 0;
int Sum = 0;
memset(InNum, 0, 18);
printf("\n请输入身份证前17位数字,按回车键结束:\n\t");
fflush(stdin);
scanf("%s",InNum);
printf("\n输入的前17位数字为: \n\t");
for(i = 0;i < 17;i++)
{
// 将ASCII码值 转化为数字
InNum[i] -= 0x30;
printf("%d",InNum[i]);
}
Sum = InNum[0]*7 + InNum[1]*9 + InNum[2]*10 + InNum[3]*5 + InNum[4]*8 +InNum[5]*4 + InNum[6]*2 + InNum[7]*1 + InNum[8]*6
+ InNum[9]*3 + InNum[10]*7 + InNum[11]*9 + InNum[12]*10 + InNum[13]*5 + InNum[14]*8 + InNum[15]*4 + InNum[16]*2;
printf("\n生成的身份证号码为: \n\t");
for(i = 0;i < 17;i++)
printf("%d",InNum[i]);
printf("%c", CheckNum[Sum % 11]);
printf("\nOK\n");
return 0;
}
更多推荐
已为社区贡献5条内容
所有评论(0)