将18位的身份证号的前17位与对应的加权因子相乘对11取余,然后余数对应的code就应该是身份证号的第18位,获取到的值与第十八位相比如果相等,那就校验通过。
我们以11111111111111111
(17个1)这个数字为例
17 位的加权因子分别是 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
int arr[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};//系数
然后进行1*7+1*9+1*10+1*5+1*8+1*4+1*2+1*1+1*6+1*3+1*7+1*9+1*10+1*5+1*8+1*4+1*2
进行求和结果等于100
然后进行100%11=1
将结果1与下表对照,如果一致,则符合规则;反之,不符合规则
char brr[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
代码如下:
#include<stdio.h>
#include <assert.h>
#include <math.h>
//true 1
//flase 0;
bool Id_Card(const char *str)
{
int count = 0;//保存最后的和
int arr[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};//系数
for(int i=0; i<=16; i++)
{
//count = count + (str[i]-'0') * arr[i];
count += (str[i]-'0') * arr[i];
}
count = count % 11;
char brr[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
return str[17] == brr[count];
//return true; //return 1
//return fasle; //return 0;
}
int main()
{
const char *str = "53010219200508011X";
bool A = Id_Card(str);
if(A)
{
printf("符合规则");
}
else
{
printf("不符合规则");
}
return 0;
}
运行结果:
符合规则