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;
}

  • 7
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 0
    评论
我国现行使用公民身份证有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。 〖GB 11643-1989〗中规定的是15位身份证:排列顺序从左至右依次为:六位数字地址,六位数字出生日期,三位数字顺序,其中出生日期不包含世纪数。 〖GB 11643-1999〗中规定的是18位身份证:公民身份号是特征组合,由十七位数字本体和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址,八位数字出生日期,三位数字顺序和一位数字校验码。 地址表示编对象常住户口所在县(市、旗、区)的行政区划代。 生日期表示编对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。 顺序表示同一地址所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序的奇数分给男性,偶数分给女性。 校验码是根据前面十七位数字,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验。 公式如下:   ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., 18 ) (1)   "*" 表示乘号   i--------表示身份证每一位的序号,从右至左,最左侧为18,最右侧为1。   a[i]-----表示身份证第 i 位上的号   W[i]-----表示第 i 位上的权值 W[i] = 2^(i-1) mod 11   计算公式 (1) 令结果为 R 根据下表找出 R 对应的校验码即为要求身份证校验码C。   R 0 1 2 3 4 5 6 7 8 9 10   C 1 0 X 9 8 7 6 5 4 3 2 由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证中可能含有非数字的字母X。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:护眼 设计师:闪电赇1 返回首页
评论

打赏作者

小木_.

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值