作者 范鹏程
单位 内蒙古师范大学
试定义一个类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
参考示例:
istream&operator>>(istream& cin, char (&s)[15]){
string str;
cin>>str;
for (int i=0;i<15;i++)
s[i] = str[i];
return cin;
}
class ID{
private:
char id[20];
int length;
public:
ID(char oldID[]){
length=15;
for (int i=0;i<15;i++)
id[i]=oldID[i];
}
void print(){
for (int i=0;i<length;i++)
cout<<id[i];
cout<<endl;
}
void convert(){
char newID[19];
for (int i = 0; i < 6; i++)
newID[i] = id[i];
newID[6] = '1';
newID[7] = '9';
newID[8] = id[6];
newID[9] = id[7];
for (int i = 8; i < 15; i++)
newID[i + 2] = id[i];
int weight[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6,3, 7, 9, 10, 5, 8, 4, 2};
char code[11] = {'1', '0', 'X', '9', '8', '7','6', '5', '4', '3', '2'};
int sum = 0;
for (int i = 0; i < 17; i++)
sum += (newID[i] – '0') * weight[i];
newID[17] = code[sum % 11];
for (int i = 0; i < 18; i++)
id[i] = newID[i];
length = 18;
}
};
网硕互联帮助中心





评论前必须登录!
注册