0
点赞
收藏
分享

微信扫一扫

每日一题C语言6

三分梦_0bc3 2022-03-11 阅读 49
c语言

题目:
我国现行的二代身份证号码是18位数字,由前17位数字本体码和最后1位校验码组成.校验码通过前17位数字根据一定规则计算得出,如果校验码不符合这个规则,那么该号码肯定是假号码.
计算方法为:前17位分别乘权重后相加,权重表如下图
在这里插入图片描述
乘积和除以11得到余数,再将余数从0-10转换为
{‘1’,‘0’,‘X’,‘9’,‘8’,‘7’,‘6’,‘5’,‘4’,‘3’,‘2’}
对比身份证最后一位是否校验正确,若正确输出出生日期,错误则输出"Fail"

思路
将身份证读到一个字符串中,再把每个char转换为int (根据ascii表-48即可)
然后将这些数据存到一个数组中与权重相乘后计算即可

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char turn[11]={'1','0','X','9','8','7','6','5','4','3','2'};
    int sfz[17];
    int i;
    long int total=0;
    char input[18];
    int yushu;
    char birthday[16];
    scanf("%s",input);
    for(i=0;i<=16;i++)
    {
		sfz[i]=(int)(input[i]-48);
    }
    for(i=0;i<=16;i++)
    {
		total=total+(sfz[i]*wi[i]);
    }
    yushu=total%11;
    if(turn[yushu]==input[17])
    {
        sprintf(birthday,"%d%d%d%d%s%d%d%s%d%d",sfz[6],sfz[7],sfz[8],sfz[9],".",sfz[10],sfz[11],".",sfz[12],sfz[13]);
		printf("%s\n",birthday);
        printf("真身份证\n4");
    }
    else
    {
		printf("Fail\n");
    }
	return 0;
}

运行结果如下:
在这里插入图片描述

举报

相关推荐

0 条评论