• 身份证校验(c++实现)


    描述:

    我国国标〖GB 11643-1999〗中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:
    (1)十七位数字本体码加权求和公式
    S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
    其中Ai:表示第i位置上的身份证号码数字值
    Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为
    Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
    (2)计算模
    Y = mod(S, 11)
    (3)通过模Y查下表得到对应的校验码
    Y
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    校验码
    1
    0
    X
    9
    8
    7
    6
    5
    4
    3
    2
    例如:某身份证前17位为11010519491231002
    i
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    wi
    7
    9
    10
    5
    8
    4
    2
    1
    6
    3
    7
    9
    10
    5
    8
    4
    2
     
    1
    1
    0
    1
    0
    5
    1
    9
    4
    9
    1
    2
    3
    1
    0
    0
    2
    7
    9
    0
    5
    0
    20
    2
    9
    24
    27
    7
    18
    30
    5
    0
    0
    4
    得到和为:167;则模为y=167%11=2
    查(3)得校验码为X(大写)
    请按上面所述步骤编程,输入一个二代身份证号,检查该身份证是否正确。
     
    输入:输入若干行,每行一个身份证号码,最后一行输入-1
    输出:输出1代表正确,0代表错误
    input:
    120223198902021249
    130132199210293822
    130402198207290622
    -1
    output:
    1
    1
    0
     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 
     5 int cal(string a)
     6 {
     7     return (a[0] - '0') * 7 + (a[1] - '0') * 9 + (a[2] - '0') * 10 +  (a[3] - '0') * 5 + (a[4] - '0') * 8 + (a[5] - '0') *4  + (a[6] - '0') * 2 + (a[7] - '0') * 1 + (a[8] - '0') * 6 +(a[9] - '0') * 3 + (a[10] - '0') * 7 + (a[11] - '0') * 9 + (a[12] - '0') * 10 + (a[13] - '0') * 5 + (a[14] - '0') * 8 + (a[15] - '0') * 4 +(a[16] - '0') * 2;
     8 }
     9 
    10 char s(string a)
    11 {
    12     int k = cal(a) % 11;
    13     if (k == 0)
    14         return '1';
    15     else if (k == 1)
    16         return '0';
    17     else if (k == 2)
    18         return 'X';
    19     else
    20         return '0'+12-k;
    21 }
    22 int main()
    23 {
    24     string number;
    25     while ((cin >> number) && number != "-1")
    26     {
    27         if (number[17] == s(number))
    28             cout << "1" << endl;
    29         else
    30             cout << "0" << endl;
    31     }
    32     system("pause");
    33     return 0;
    34 }    
  • 相关阅读:
    javascript事件委托和jQuery事件绑定on、off 和one
    转:程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
    网游加速器原理、技术与实现
    自动化测试等级
    游戏测试工具
    JMeter
    Python高级编程
    测试提高项目的方法
    python mysqldb
    Python中的操作符重载
  • 原文地址:https://www.cnblogs.com/wuyoucao/p/4690772.html
Copyright © 2020-2023  润新知