zoukankan      html  css  js  c++  java
  • 身份证合法性判定

    问题描述:
     
    我国公民的身份证号码特点如下:

    1、     长度为18位;

    2、     第1~17位只能为数字;
    3、     第18位可以是数字或者小写英文字母x。
    4、     身份证号码的第7~14位表示持有人生日的年、月、日信息。

    请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。

    校验码验证规则如下:

    1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

    2、将这17位数字和系数相乘的结果相加;

    3、用加出来和除以11,看余数是多少?;

    4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
     
    5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2;
     
     例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
     首先:我们得出,前17位的乘积和是189
     然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
     最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
    代码如下:
    // WorkTesting.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    bool StrParseToInt(const char* id,int intId[],int length)
    {
      char ch;
      bool success = true;
     
      for (int i = 0; i<length;i++)
      {
          ch = id[i];
          if( ch >= '0'&&ch <='9')
              intId[i] = ch -'0';
          else
              success = false;
          if (!success)
          {
              return success;
          }
      }
    }
    
    bool IsValid(const char* id,int length)
    {
       bool isValid = false;
       int year,month,day; // 年份大于1900,小于2100
       if (length!=18)
       {
           return isValid;
       }
    
       int intId[17];
    
       if(StrParseToInt(id,intId,17))
           isValid = true;
       else 
           return false;
    
       year = 1000 * intId[6]+100*intId[7]+10*intId[8]+intId[9];
       month = 10*intId[10]+intId[11];
       day = 10*intId[12]+intId[13];
       if (year >= 1900 && year <=2100 && month >0 && month <13)
       {
           isValid = true;
       }
       else return false;
    
       int daysofMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    
       if (year%4==0&&year%100!=0||year%400==0)
       {
           daysofMonth[1] = 29;
       }
       if(day <= daysofMonth[month-1])
       {
           isValid = true;
       }
       else
           return false;
    
       int x[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//校验码系数、
       int count = 0;
       for(int i=0; i<length-1; i++)
           count += intId[i]*x[i];
       int remainder = count % 11;
       string check = "10X98765432";
       if(id[17]==check[remainder])
           isValid = true;
       else
           return false;
       return isValid;
        
    
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        char* id = "34052419800101001X";
        int length = strlen(id);
        bool isValid = IsValid(id,length);
        cout << isValid;
        return 0;
    }
  • 相关阅读:
    如何找回未保存过的 Excel 文件?
    js 下关于json的销毁和添加
    width:100%和width:auto区别
    在ie6下的png图片的兼容问题
    关于input=file的用法
    div+Css绝对定位(absolute)和相对定位(relative)的总结
    onmouseenter和onmouseleave的兼容性问题
    ckfinder的配置使用
    破解ckfinder2.3 去除版本号和标题提示
    jQuery制作图片的等比例缩放
  • 原文地址:https://www.cnblogs.com/slysky/p/2729311.html
Copyright © 2011-2022 走看看