前言:
由于在某些时候,可能需要用户输入真实的身份证号,但是用户可能会胡乱输入虚假的身份证号,导致信息的不真实性,所以为了防止用户胡乱输入,可以通过一些小方法来检测身份证号是否输入正确,本文将介绍一种方法——检测效验码,来检测身份证号码的准确性。
方法:
1.将身份证号码前17位数分别乘以下面系数列表对应的数 结果之和并除以11,得到余数。
第1位到第17位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
2.余数只可能有0 、1、 2、 3、 4、 5、 6、 7、 8、 9、 10这11个数字。
其分别对应的身份证号最后一位(效验码 共11种)的列表:1、0、X、9、8、7、6、5、4、3、2。
余数: 0 1 2 3 4 5 6 7 8 9 10
效验码列表: 1 0 X 9 8 7 6 5 4 3 2
所以我们以身份证号:310107198607081310 为例来讲解
如上所示身份证号的前17位数分别与系数列表各位相对应,红色数字为身份证效验码,分别相乘得到乘积及总和。
然后将265除以11得到的余数1与效验码列表进行对应,得到效验码是0,所以与提供的身份证号的最后一位相同,即正确的身份证号。
下面附上用C++进行实现该检测程序的代码:(望dalao们不要吐槽代码质量~)
/*
检验18位身份证号是否正确
用于测试的身份证:
正确 身份证:310107198607081310
错误 身份证:310107198507081310
*/
#include
#include
bool verifyIdCard(const char* idCard);
int main(void){
char idCardTemp[19]; //用于存储18位身份证字符串
std::cin.getline(idCardTemp,19);
if(verifyIdCard(idCardTemp)){
std::cout << "ID Card - Good!" << std::endl; //身份证正确则输出
}else{
std::cout << "ID Card - Error!" << std::endl; //身份证错误则输出
}
return 0;
}
bool verifyIdCard(const char* idCard){
if(strlen(idCard) != 18){ //检测当前身份证是否为18位
return false;
}else{
int coefficient[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //身份证前17位对应的系数列表
char checkCodeList[] = {'1','0','X','9','8','7','6','5','4','3','2'}; //余数所对应的效验码列表
int Sum = 0;
int remainder;
char checkCodeValue;
for(int i=0;i<17;++i){
Sum += (idCard[i]-48) * coefficient[i]; //身份证前17位分别与对应的系数相乘之和
}
remainder = Sum % 11; //取余数
checkCodeValue = checkCodeList[remainder]; //余数只会是[0,10] 计算得到身份证最后一位 效验码
if(checkCodeValue == 'X'){ //用于效验码是'X'的一些处理
if(checkCodeValue == std::toupper(idCard[17])){
return true;
}else{
return false;
}
}else{
if(checkCodeValue == idCard[17]){
return true;
}else{
return false;
}
}
}
};
当然,该检测方法,只能降低用户提供虚假的信息可能性,但不能完全确保用户提供的身份信息不是虚假的。