背景:1985年起我国实行居民身份证制度。当时签发的身份证号码是15位的,第7、8位为出生年份的后两位(如1980年出生的人,7、8位就是80)。由于2000年的到来,1999年起签发的身份证调整为18位。具体调整规则是:在第7-10位改为完整的出生年份,并将原15位身份证第9位之后的数字依次向后平移两位,这样,就得到一串17位的数字(例如:340524800101001变为34052419800101001)。18位身份证号中,新增最后一位校验码,校验码的具体计算规则如下图:
编写一个程序,输入一个15位身份证号,输出转换后的18位身份证号,要求用C++类和对象实现。PS:由于1999年后签发的身份证均为18位,所以无需考虑00后。
//
// main.cpp
// 15位身份证扩展18 C++
//
// Created by louyu on 2019/1/27.
// Copyright © 2019 louyu. All rights reserved.
//
#include <bits/stdc++.h>
using namespace std;
//定义身份证类
class id
{
private:
string s,x; //s存放身份证号,x存放校验码
int w[17]; //存放身份证前17位的权值
public:
id(string str); //构造方法
void fun(); //15位转换18位方法
void print(); //输出方法
};
id::id(string str)
{
s=str;
x="10X98765432";
int w1[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
for (int i=0; i<17; i++)
{
w[i]=w1[i];
}
}
void id::fun()
{
s.insert(6, "19");
int sum=0;
for (int i=0; i<17; i++)
{
sum+=w[i]*(s[i]-'0');
}
sum%=11;
s.insert(17, x.substr(sum,1));
}
void id::print()
{
cout<<s<<endl;
}
int main()
{
string str;
cout<<"输入一个15位身份证号:"<<endl;
cin>>str;
id ID(str);
ID.fun();
cout<<"转换后的18位身份证号为:"<<endl;
ID.print();
return 0;
}
输出结果:
2000年前出生的童鞋,也可以输入自己对应15位的原身份证号码(在18位的基础上删去第7、8位和最后一位),若能正确还原18位身份证号,那就没问题了!