[题目链接](蓝桥杯算法提高VIP-不同单词个数统计 - C语言网)
### 题意
> 从1999年10月1日开始,公民身份证号码由15位数字增至18位。(18位身份证号码简介)。升级方法为:
1、把15位身份证号码中的年份由2位(7,8位)改为四位。
2、最后添加一位验证码。验证码的计算方案:
将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2。
请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码。假设所有要升级的身份证的四位年份都是19××年
输入
一个15位的数字串,作为身份证号码
输出
一个18位的字符串,作为升级后的身份证号码
样例输入复制
110105491231002
样例输出复制
11010519491231002x
### 思路
> 1. 把原6位之前即第6位的数字转到新数组里
> 2. 7,8位单独写进数组
> 3. 再把原6位之后的数字转到新数组里
### 坑点
> 1. 算校验码需要乘系数
> 2. 需要字符和数字类型转化
### 算法:模拟
#### 时间复杂度
$时间限制: 1Sec 内存限制: 128MB
#### 实现步骤
> 1. 把原6位之前即第6位的数字转到新数组里
> 2. 7,8位单独写进数组
> 3. 再把原6位之后的数字转到新数组里
#### 代码
```#include<string>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int n,m;
char a[100005];//定义char类型数组
int x[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//先把系数列出来
int main()
{
string s;
cin>>s;
for(int i=0;i<6;i++)//原数组
{
a[i]=s[i];
}
a[6]='1';
a[7]='9';
int y=8;
for(int i=6;i<15;i++)
{
a[y]=s[i];
y++;
}
int sum=0,num=0;
for(int i=0;i<17;i++)
{
sum+=x[i]*(a[i]-'0');//把a[i]数组转化为int类型,再乘系数
}
sum=sum%11;
//cout<<num<<endl;
if(sum==0)//将校验码一一对应
{
a[17]='1';
}
if(sum==1)
{
a[17]='0';
}
if(sum==2)
{
a[17]='x';
}
if(sum==3)
{
a[17]='9';
}
if(sum==4)
{
a[17]='8';
}
if(sum==5)
{
a[17]='7';
}
if(sum==6)
{
a[17]='6';
}
if(sum==7)
{
a[17]='5';
}
if(sum==8)
{
a[17]='4';
}
if(sum==9)
{
a[17]='3';
}
if(sum==10)
{
a[17]='2';
}
for(int i=0;i<18;i++)
{
cout<<a[i];
}
return 0;
}
```
### 总结
> x不要弄错位置,细心模拟