問題描述:
我國公民的身份證號碼特點如下:
1、 長度為18位;
2、 第1~17位只能為數字;
3、 第18位可以是數字或者小寫英文本母x。
4、 身份證號碼的第7~14位表示持有人生日的年、月、日資訊。
例如:511002198808080111或51100219880808011x。
請實現身份證號碼合法性判斷的函式。除滿足以上要求外,需要對持有人生日的年、月、日資訊進行校驗。年份大於等於2023年,小於等於2023年。需要考慮閏年、大小月的情況。所謂閏年,能被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
#include
using
namespace
std;
int verifyidcard(char* input)
}if(!isdigit(input[17]) && input[17]!='x')
return
3; year[0]=input[6];
year[1]=input[7];
year[2]=input[8];
year[3]=input[9];
year[4]='\0';
int year_num=atoi(year);
if(year_num<=1900 || year_num>=2100)
return
4; month[0]=input[10];
month[1]=input[11];
month[2]='\0';
int month_num=atoi(month);
if(month_num<1 || month_num>12)
return
5; day[0]=input[12];
day[1]=input[13];
day[2]='\0';
int day_num=atoi(day);
if(day_num<=0 || day_num>31)
return
6; if((year_num%4==0 && year_num%100 !=0) || (year_num % 400==0)) //閏年
else
}else
//非閏年
else
}return0;}
int main()
身份證合法性驗證
2015年10月14日 16 42 22 從網上扒的,刪掉了一小段無用 修改了一行判斷省份的 1 2 身份證號驗證 相容15,18位 3 4function checkidentitycode idcard 5 12 city array 13 11 北京 12 天津 13 河北 14 山西 15 ...
身份證合法性驗證
2015年10月14日 16 42 22 從網上扒的,刪掉了一小段無用 修改了一行判斷省份的 1 2 身份證號驗證 相容15,18位 3 4function checkidentitycode idcard 5 12 city array 13 11 北京 12 天津 13 河北 14 山西 15 ...
身份證合法性校驗模板
這個可以驗證15位和18位的身份證,並且包含生日和校驗位的驗證。如果有興趣,還可以加上身份證所在地的驗證,就是前6位有些數字合法有些數字不合法。function isidcardno num num num.touppercase 身份證號碼為15位或者18位,15位時全為數字,18位前17位為數字...