题目描述
身份证号码是由十七位数字本体码和一位校验码组成。排列顺序从左到右依次为:六位数字“地址码”、八位数字“出生日期码”、三位数字“顺序码”和一位数字“校验码”。
“地址码”用来表示公民常住户口所在地区的行政区划代码。
“出生日期码”表示公民的出生年、月、日。
“顺序码”表示在同一“地址码”所表示的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
“校验码”是根据前面十七位数字计算得到,计算方法为:
第1步:将前面的身份证号码17位数分别乘以不同的系数。从第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;也就是说如果上面得到的余数为2,那校验码就是X,如果余数为10,那校验码就是2。
现在你只记得自己身份证上的前17位,你能否不用回家拿身份证就可以知道最后一位是多少?
输入
输入只有一行,由17个数字组成,表示身份证号码的前17位,数字和数字之间用空格隔开。
输出
输出该身份证的最后一位校验码。
样例输入 复制
4 4 2 0 0 0 1 9 9 6 0 1 0 1 0 2 3
样例输出 复制
4
来源/分类
代码:
#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int xxx[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int a[20],x=0;
for (int i = 0; i < 17; i++) {
cin>>a[i];
x += a[i]*xxx[i];
}
x=x%11;
switch(x) {
case 0:cout<<'1';
break;
case 1:cout<<'0';
break;
case 2:cout<<'X';
break;
case 3:cout<<'9';
break;
case 4:cout<<'8';
break;
case 5:cout<<'7';
break;
case 6:cout<<'6';
break;
case 7:cout<<'5';
break;
case 8:cout<<'4';
break;
case 9:cout<<'3';
break;
case 10:cout<<'2';
break;
}
return 0;
}