题目描述:
第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入19;第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。
校验码计算方法:将身份证前十七位数分别乘以7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,将这十七位数字和系数相乘的结果相加,用加出来的和除以11,看看余数是多少。余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,这样就得出了第二代身份证第十八位数的校验码。
输入15位身份证号,对其升位,输出升位后的18位身份证号。
输入要求:
测试次数T
每组测试数据为15位身份证号
输出要求:
对每组测试数据,给出升位后的18位身份证号。
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
char arr[18];//以字符的形式输入
cin >> arr;
for (int i = 16; i > 5; i--)//第6位之后的后移两位
{
arr[i] = arr[i - 2];
}
int sum = 0;
arr[6] = '1';
arr[7] = '9';
int brr[18];
for (int j = 0; j < 17; j++)
{
brr[j] = arr[j] - '0';//将数组从字符串改成整型
}
sum = 7 * brr[0] + 9 * brr[1] + 10 * brr[2] + 5 * brr[3] + 8 * brr[4] + 4 * brr[5] + 2 * brr[6] + 1 * brr[7] + 6 * brr[8] + 3 * brr[9] + 7 * brr[10] + 9 * brr[11] + 10 * brr[12] + 5 * brr[13] + 8 * brr[14] + 4 * brr[15] + 2 * brr[16];
int r = sum % 11;
switch (r)//选择循环
{
case 0: arr[17] = '1'; break;
case 1: arr[17] = '0'; break;
case 2: arr[17] = 'X'; break;
case 3: arr[17] = '9'; break;
case 4: arr[17] = '8'; break;
case 5: arr[17] = '7'; break;
case 6: arr[17] = '6'; break;
case 7: arr[17] = '5'; break;
case 8: arr[17] = '4'; break;
case 9: arr[17] = '3'; break;
case 10: arr[17] = '2'; break;
}
for (int k = 0; k < 18; k++)
{
cout << arr[k];
}
cout << endl;
}
return 0;
}