身份证验证

    xiaoxiao2021-04-13  343

    身份证验证

    时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:187            测试通过:137

    描述

    18位身份证格式

    110105 19491231 002 X 1.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 2.地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。 3.出生日期码:表示编码对象出生的年、月、日,代码之间不用分隔符. 4.顺序码的奇数分配给男性,偶数分配给女性。 5.校验码:    n校验码: n(1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 n(2)计算模  Y = mod(S, 11) n(3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2 n举例如下: 北京市朝阳区: 11010519491231002X 广东省汕头市: 440524188001010014  

    输入18位身份证号码,验证其号码的正确性。 n如果正确,则输出“YES”,否则输出错误信息“NO”。

    输入

    每行一个测试数据,表示一个18位身份证的号码。

    输出

    根据验证规则,计算其正确性,如果正确,则输出“YES”,否则输出错误信息“NO”。

    样例输入

    11010519491231002X

    样例输出

    YES 主要是明白加权的意思 #include<stdio.h> int main() { char a[19]; int n,m,i,j,p,s,y; while(gets(a)) { char cheak[20]="10X98765432",wi[20]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; s=0,y=0; for(i=0; i<17; i++) { s+=(a[i]-'0')*wi[i]; } y=s; if(cheak[y]==a[17]) p=0; else p=1; if(p==1) printf("NO\n"); else if(p==0) printf("YES\n"); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-669307.html

    最新回复(0)