6-16 身份证升位
分数 30
全屏浏览
切换布局
作者 范鹏程
单位 内蒙古师范大学
试定义一个类ID,将15位的旧版身份证号扩充为18位。在15位的身份证号中,第7、8两位为出生年份,例如:1980年出生的人,身份证号码的第7、8位的值是80,在18位身份证号中,将7-10四位的值改为1980,并将原身份证号码第9位开始以后所有数字依次向右平移2位,在18位身份证号码中,最后增加一位校验码,校验码的计算方法如下(只考虑20世纪出生的公民):
(1)将已扩展出的17位身份证号按各位上的数字进行加权求和,结果为S。自左到右各位上的数字的权值依次为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}
(2)将S对11取余运算,结果为Y
(3)根据Y取值的大小顺序{0,1,2,3,4,5,6,7,8,9,10}取对应的校验码{1,0,X,9,8,7,6,5,4,3,2}
例如:当15位身份证号位340524800101001时,扩展成17位:34052419800101001,各位上的数字的加权和S=3*7+4*9+0*10+...=189
,S对11取余,得2,则校验码为X。最终升位后的身份证号码为:34052419800101001X
##请补充类的定义,实现上述功能
测试主程序如下:
#include<iostream> #include <string.h> using namespace std; /* 请在这里填写答案 */ int main() { char oldID[15]; cin>>oldID; ID myID(oldID); cout<<"ID No.:"; myID.print(); myID.convert(); cout<<"New ID NO.:"; myID.print(); return 0; }
输入样例:
150105890811001
输出样例:
ID No.:150105890811001
New ID NO.:150105198908110012
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
using namespace std;
class ID{
string oldID;
string newID;
public:
ID(string oldID){
this->oldID = oldID;
}
void print(){
cout<<oldID<<endl;
}
void convert(){
newID = oldID + " ";
newID[6] = '1';
newID[7] = '9';
for(int i=8;i<17;i++){
newID[i] = oldID[i-2];
}
int quan=0;
for(int i=0;i<17;i++){
quan+=s(newID[i],i);
}
oldID = newID+jy(quan);
}
int s(char a,int i){
int t=a-'0';
switch(i){
case 0:return t*7;break;
case 1:return t*9;break;
case 2:return t*10;break;
case 3:return t*5;break;
case 4:return t*8;break;
case 5:return t*4;break;
case 6:return t*2;break;
case 7:return t*1;break;
case 8:return t*6;break;
case 9:return t*3;break;
case 10:return t*7;break;
case 11:return t*9;break;
case 12:return t*10;break;
case 13:return t*5;break;
case 14:return t*8;break;
case 15:return t*4;break;
case 16:return t*2;break;
}
}
char jy(int quan){
quan%=11;
switch(quan){
case 0:return '1';break;
case 1:return '0';break;
case 2:return 'X';break;
case 3:return '9';break;
case 4:return '8';break;
case 5:return '7';break;
case 6:return '6';break;
case 7:return '5';break;
case 8:return '4';break;
case 9:return '3';break;
case 10:return '2';break;
}
}
};