题目描述
我国国标〖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;
}