先将身份证前面的17位数分别乘以不同的系数,然后将每一个相乘的结果相加,用所得之和除以11,看余数是多少,余数是0--9尾数就是0-9,如果余数是10,那么身份证的第18位数字就用罗马数字的【χ代替】。
因为是10的话就有19位数字了,与身份证号码十八位数的国家标准不相符合。因为是10的话就有19位数字了,与身份证号码十八位数的国家标准不相符合。
X:英语中第24个字母。X 表示未知、无限,X 还有“目标”和“希望”,X 在社会学界表示“完美”,千言万语都可以用 X 来传递。数学中 X 在方程中通常表示未知数的值。在罗马数字中,X 表示十。
扩展资料:
身份证号码18位数字其表示的含义分别为:
第1、2位, 所在省份的代码;
第3、4位 :所在城市的代码;
第5、6位:所在区县的代码;
第7——14位 :出生年、月、日
(7、8、9、10位是年,11、12位是月,13、14位是日);
第15、16位 :所在地派出所的代码;
第17位 :奇数1、3、5、7、9表示男性,偶数2、4、6、8表示女性;
第18位:校检码:为0——9数字,或者罗马数字χ表示。
参考资料来源:百度百科-居民身份证号码
第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们得出,前17位的乘积和是189
然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
用第1位数乘以2的16次方(即65536)
加上
第2位数乘以2的15次方(32768)
加上
第3位数乘以2的14次方(16384)
加上
第4位数乘以2的13次方(8192)
加上
第5位数乘以2的12次方(4096)
加上
第6位数乘以2的11次方(2048)
加上
第7位数乘以2的10次方(1024)
加上
第8位数乘以2的9次方(512)
加上
第9位数乘以2的8次方(256)
加上
第10位数乘以2的7次方(128)
加上
第11位数乘以2的6次方(64)
加上
第12位数乘以2的5次方(32)
加上
第13位数乘以2的4次方(16)
加上
第14位数乘以2的3次方(8)
加上
第15位数乘以2的2次方(4)
加上
第16位数乘以2的1次方(2)
加上
第17位数乘以2的0次方(1)
将所得的数乘以9再加上1的和除以11,所得的余数便是18位身份证号的最后一位(余数为10时最后一位是X)。
#include
#include
#include
#include
int checkid(char * string)
{
int coefficient[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int checksum=0;
int remainder=0;
int i;
char lastdigit;
for(i=0;i<17;++i)
{
checksum=checksum + (string[i]-'0')* coefficient[i];
}
remainder = checksum % 11;
if(remainder == 1)
{
lastdigit = '0';
}
else if(remainder == 0)
{
lastdigit = '1';
}
else if(remainder ==2)
{
lastdigit ='X';
}
else
{
lastdigit = 12-remainder + '0';
}
return(lastdigit == string[17]);
}
void getbirthday(char * id, int date[])
{
int year;
int month;
int day;
char string[100];
strcpy (string ,&id[6]);
string[4] = '\0';
year = atoi(string);
strcpy (string ,&id[10]);
string[2] = '\0';
month = atoi(string);
strcpy (string ,&id[12]);
string[2] = '\0';
day = atoi(string);
date[0]=year;
date[1]=month;
date[2]=day;
}
int getage(char * string)
{
int birthday[3];
int today[3];
int age;
getbirthday(string,birthday);
printf("请输入今天的年月日\n");
scanf("%d%d%d",&today[0],&today[1],&today[2]);
if(birthday[0] <= today[0])
{
if(birthday[1] > today[1])
{
age = today[0] - birthday[0] ;
}
else if (birthday[1] == today[1])
{
if (birthday[2] > today[2])
{
age = today[0] - birthday[0] - 1;
}
if (birthday[2] <= today[2])
{
age = today[0] - birthday[0];
}
}
else if(birthday[1] < today[1])
{
{
age = today[0] - birthday[0];
}
}
else
{
printf("生日错误!\n");
}
return age;
}
}
int getsex(char * id)
{
return(id[16] - '0')%2;
}
void shengxiao(char * id)
{
int birthday[3];
int result;
getbirthday(id,birthday);
result = ((birthday[0] - 2019)%12 + 12)%12;
switch(result)
{
case 0:printf("您的生肖为猪\n");break;
case 1:printf("您的生肖为鼠\n");break;
case 2:printf("您的生肖为牛\n");break;
case 3:printf("您的生肖为虎\n");break;
case 4:printf("您的生肖为兔\n");break;
case 5:printf("您的生肖为龙\n");break;
case 6:printf("您的生肖为蛇\n");break;
case 7:printf("您的生肖为马\n");break;
case 8:printf("您的生肖为羊\n");break;
case 9:printf("您的生肖为猴\n");break;
case 10:printf("您的生肖为鸡\n");break;
case 11:printf("您的生肖为狗\n");break;
default:printf("错误!");
}
}
void main()
{
char string[20];
char * id =string;
int birthday[3];
int today[3];
printf("请输入您的身份证号:\n");
scanf("%s",string);
if(checkid(string)){
printf("您的身份证号通过了校验\n");
}else{
printf("您的身份证非法!\n");
exit(0);
}
if(getsex(id))
{
printf("您的性别为男\n");
}else
{
printf("您的性别为女\n");
}
getbirthday(id,birthday);
printf("您出生于%d年%d月%d日\n",birthday[0],
birthday[1],birthday[2]);
printf("您今天是%d岁\n",getage(string));
shengxiao(id);
}
身份证校验码:身份证号码的最后一位