【C++】6-16 身份证升位 分数 30

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;
        }
    }
};

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值