将15位一代身份证号码转换成18位(C++类和对象实现)

背景: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位身份证号,那就没问题了!

发表评论