您的位置:首页 > 编程语言 > C语言/C++

华为机试题:身份证号码合法性判断

2013-08-01 17:24 302 查看
/***************************************************************************************************************************

身份证号码合法性判断

问题描述:

我国公民的身份证号码特点如下:

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(请注意闰年的情况);

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。

要求实现函数:

int verifyIDCard(char* input)

【输入】  char* input,表示输入的身份证号码字符串

【输出】  无

【返回】  判断的结果,类型为int

示例

1) 输入:”511002111222”,函数返回值:1;

2) 输入:”511002abc123456789”,函数返回值:2;

3) 输入:”51100219880808123a”,函数返回值:3;

4) 输入:”511002188808081234”,函数返回值:4;

5) 输入:”511002198813081234”,函数返回值:5;

6) 输入:”511002198808321234”,函数返回值:6;

7) 输入:”511002198902291234”,函数返回值:7;

8) 输入:”511002198808081234”,函数返回值:0;

***************************************************************************************************************************/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int verifyIDCard(char* input)

{

 if(strlen(input)!=18)

  return 1;

 int i;

 for(i=0;i<17;i++)

 {

  if(input[i]<'0'||input[i]>'9')

   return 2;

 }

 if(input[17]=='x' || (input[17]>='0' && input[17]<='9'));

 else return 3;

 char year[5];

 year[0]=input[6];

 year[1]=input[7];

 year[2]=input[8];

 year[3]=input[9];

 year[4]='\0';

 unsigned int year_number=atoi(year);

 if(year_number<1900||year_number>2100)

  return 4;

 char month[3];

 month[0]=input[10];

 month[1]=input[11];

 month[2]='\0';

 unsigned int month_number=atoi(month);

 if(month_number<1||month_number>12)

  return 5;

 char day[3];

 day[0]=input[12];

 day[1]=input[13];

 day[2]='\0';

 unsigned int day_number=atoi(day);

 if(((year_number%4==0) && (year_number%100!=0)) || (year_number%400==0))

 {

  if(2==month_number)

  {

   if(day_number<1 || day_number>29)

    return 6;

  }

  else if(month_number==1 || month_number==3 || month_number==5 || month_number==7 || month_number==8 || month_number==10 || month_number==12)

  {

  if(day_number<1 || day_number>31)

   return 6;

  }

  else

  {

   if(day_number<1 || day_number>30)

   return 6;

  }

 }

 else

 {

  if(month_number==2)

  {

   if(day_number<1 || day_number>28)

    return 6;

  }

  else if(month_number==1 || month_number==3 || month_number==5 || month_number==7 || month_number==8 || month_number==10 || month_number==12)

  {

   if(day_number<1 || day_number>31)

    return 6;

  }

  else

  {

   if(day_number<1 || day_number>30)

    return 6;

  }

 }

 return 0;

}

int main()

{

 int J;

 char str[25];

 printf("input the IDnumber:");

 gets(str);

 J=verifyIDCard(str);

 printf("\nThe return_value=%d",J);

 system("pause");

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++