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();
 }

 

posted @ 2023-01-08 10:14  myrj  阅读(673)  评论(0编辑  收藏  举报