C语言:身份证号校验位计算(方法三)
#include <stdio.h> /* 身份证号码是由18位数字组成的,他们分别表示: 1、前1、2位数字表示:所在省份的代码。 2、前3、4位数字表示:所在城市的代码。 3、前5、6位数字表示:所在区县的代码。 4、第7~14位数字表示:出生年、月、日,7、8、9、10位是年,11、12位是月,13、14位是日。 5、第15、16位数字表示:所在地的派出所的代码。 6、第17位数字表示性别:奇数表示男性,偶数表示女性。 7、第18位数字是校检码:校检码可以是0~9的数字,有时也用X表示。 校验码(身份证最后一位)。它是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。 计算方法 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。(即余数0对应1,余数1对应0,余数2对应X...) 5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。 */ //连续输入17个数字(整型)再计算 main() { int a[17],b,sum=0; int c[17]={-7,-9,-10,-5,-8,-4,-2,-1,-6,-3,-7,-9,-10,-5,-8,-4,-2}; int d[11]={0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10}; char e[12]="10X98765432"; printf("请连续输入身份证号前17位\n") ; for(b=0;b<=16;b++) { scanf("%1d",&a[b]);//每次输入1位数分别赋值给数组 sum=sum+a[b]*c[b]; } sum=sum%11; for(b=0;b<=10;b++) { if(sum==d[b]) break; } printf("最后一位是%c",e[b]); getchar(); }
#include <stdio.h> /* 身份证号码是由18位数字组成的,他们分别表示: 1、前1、2位数字表示:所在省份的代码。 2、前3、4位数字表示:所在城市的代码。 3、前5、6位数字表示:所在区县的代码。 4、第7~14位数字表示:出生年、月、日,7、8、9、10位是年,11、12位是月,13、14位是日。 5、第15、16位数字表示:所在地的派出所的代码。 6、第17位数字表示性别:奇数表示男性,偶数表示女性。 7、第18位数字是校检码:校检码可以是0~9的数字,有时也用X表示。 校验码(身份证最后一位)。它是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。 计算方法 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。(即余数0对应1,余数1对应0,余数2对应X...) 5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。 */ //连续输入17个数字字符,利用 '9'-'0'=9的方法转成数字再计算 main() { int b,sum=0; char a[18]; int c[17]={-7,-9,-10,-5,-8,-4,-2,-1,-6,-3,-7,-9,-10,-5,-8,-4,-2}; int d[11]={0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10}; char e[12]="10X98765432"; gets(a); for(b=0;b<=16;b++) { sum=sum+(a[b]-'0')*c[b]; } printf("%d\n",sum); sum=sum%11; printf("%d\n",sum); for(b=0;b<=10;b++) { if(sum==d[b]) break; } printf("最后一位是%c",e[b]); getchar(); }
#include <stdio.h> #include <math.h> /* 身份证号码是由18位数字组成的,他们分别表示: 1、前1、2位数字表示:所在省份的代码。 2、前3、4位数字表示:所在城市的代码。 3、前5、6位数字表示:所在区县的代码。 4、第7~14位数字表示:出生年、月、日,7、8、9、10位是年,11、12位是月,13、14位是日。 5、第15、16位数字表示:所在地的派出所的代码。 6、第17位数字表示性别:奇数表示男性,偶数表示女性。 7、第18位数字是校检码:校检码可以是0~9的数字,有时也用X表示。 校验码(身份证最后一位)。它是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。 计算方法 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。(即余数0对应1,余数1对应0,余数2对应X...) 5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。 */ //连续输入17个数字字符,利用 '9'-'0'=9的方法转成数字再计算 main() { int b,sum=0; char a[18]; int c[17]={-7,-9,-10,-5,-8,-4,-2,-1,-6,-3,-7,-9,-10,-5,-8,-4,-2}; char e[12]="10X98765432"; gets(a); for(b=0;b<=16;b++) { sum=sum+(a[b]-'0')*c[b]; } sum=sum%11; printf("最后一位是%c",e[abs(sum)]); getchar(); }