判断我国公民的身份证是否合法

来源:互联网 发布:des算法优缺点 编辑:程序博客网 时间:2024/05/10 12:54

//我国公民的身份证号码特点如下:
//1、     长度为18位;
//2、     第1~17位只能为数字;
//3、     第18位可以是数字或者小写英文字母x。
//4、     身份证号码的第7~14位表示持有人生日的年、月、日信息。
//例如:511002198808080111或51100219880808011x。
//请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,
//小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,
//非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。函数返回值:
//1)  如果身份证号合法,返回0;
//2)  如果身份证号长度不合法,返回1;
//3)  如果身份证号第1~17位含有非数字的字符,返回2;
//4)  如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
//5)  如果身份证号的年信息非法,返回4
//6)  如果身份证号的月信息非法,返回5;
//7)  如果身份证号的日信息非法,返回6(请注意闰年的情况);
#include<iostream>
#include<string>
using namespace std;
int getResult(string s )
{
 int len=s.size();
 int y=0;
 int m=0;
 int d=0;
 if(len==18)
 {
  for(int i=0;i<17;i++)
  {
   if(!isdigit(s[i]))
    return 2;
  }
  if(!isdigit(s[17])&&s[17]!='x')
   return 3;
  for(int i=6;i<10;i++)
  {
   y=y*10+s[i]-'0';
  }
  if(y>2100||y<1900)
   return 4;
  for(int i=10;i<=11;i++)
  {
   m=m*10+s[i]-'0';
  }
  if(m>12||m<1)
   return 5;
  for(int i=12;i<=13;i++)
  {
   d=d*10+s[i]-'0';
  }
  if(d<1||d>31)
   return 6;
  if(d==31&&(m==4||m==6||m==9||m==11))
   return 6;
  if(d==30&&(m==1||m==3||m==5||m==7||m==8||m==10||m==12))
   return 6;
  if(m==2)
  {
   if(d==29)
    if(y%4!=0||(y%400!=0&&y%100==0))
     return 6;
  }
 }
 else
  return 1;
 return 0;
}
void main()
{
 string s;
 getline(cin,s);
 cout<<getResult(s)<<endl;
}
0 0
原创粉丝点击