CCF-训练50题-NO.11-身份证校验

来源:互联网 发布:国寿资管 知乎 编辑:程序博客网 时间:2024/06/08 05:23

题目描述

我国国标〖GB 11643-1999〗中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和
其中Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)
(3)通过模Y查下表得到对应的校验码
这里写图片描述

输入

输入若干行,每行一个身份证号码,最后一行输入-1

输出

输出1代表正确,0代表错误

这里写图片描述

样例代码

#include <iostream>using namespace std;int wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};char Y[11]={'1','0','X','9','8','7','6','5','4','3','2'};int cal(char a,int c){    int b=a-'0';    return b*c;}int main(){    int sum[17];    int pos=-1;    int givepos[100];    string S;    while (1){    int res=0;    cin>>S;    if (S=="-1") break;    pos++;    for (int i=0;i<17;i++){        sum[i]=cal(S[i],wi[i]);        res+=sum[i];    }    int mod=res%11;    if (Y[mod]==S[17]) givepos[pos]=1;    else givepos[pos]=0;    }    for (int i=0;i<=pos;i++){        cout<<givepos[i]<<endl;        //if (i<pos) cout<<endl;    }    return 0;}
原创粉丝点击