身份证号第18位(效验码)计算方法 用于检测身份证号是否正确

前言:

由于在某些时候,可能需要用户输入真实的身份证号,但是用户可能会胡乱输入虚假的身份证号,导致信息的不真实性,所以为了防止用户胡乱输入,可以通过一些小方法来检测身份证号是否输入正确,本文将介绍一种方法——检测效验码,来检测身份证号码的准确性。

方法:

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 为例来讲解

身份证号第18位(效验码)计算方法 用于检测身份证号是否正确_第1张图片

如上所示身份证号的前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;
			}
		}
	}
};
当然,该检测方法,只能降低用户提供虚假的信息可能性,但不能完全确保用户提供的身份信息不是虚假的。

你可能感兴趣的:(其他)