#include "stdio.h"
#include "string.h"
void ChangeID(char src[], char dest[]);
void main()
{
char src[80];
char dest[80];
while (true)
{
printf("请输入15位身份证号码:\n");
scanf("%s", src);
bool bValid = true;
if (strlen(src)!=15)
bValid = false;
else
{
for (long k=0; k<15; k++)
{
if (src[k]<'0' || src[k]>'9')
{
bValid = false;
break;
}
}
}
if (! bValid)
{
printf("输入号码不正确。\n");
}else
{
ChangeID(src, dest);
printf("修改后的身份证号码(18位):\n%s\n", dest);
}
printf("\n是否继续?(Y/N)\n");
char answer[80];
scanf("%s", answer);
if (answer[0]!='y' && answer[0]!='Y')
break;
}
}
void ChangeID(char src[], char dest[])
{
const long weight[17] = {
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
};
const char pEnd[12] = "10X98765432";
long data[17];
long k;
for (k=0; k<6; k++)
data[k] = src[k]-'0';
// 把字符转换为真正的数字值。
long nYear = (src[6]-'0')*10 + (src[7]-'0');
// 计算年的后2位。如果是<09, 认为是2000~2009
// 否则认为是 1910~1999
// 对于很老的人可能会出错,没有办法,千年虫。
if (nYear>9)
{
// 填入19
data[6] = 1;
data[7] = 9;
}else
{
data[6] = 2;
data[7] = 0;
}
for (k=8; k<17; k++)
data[k] = src[k-2]-'0';
long nSum=0;
for (k=0; k<17; k++)
nSum += data[k]*weight[k];
long tail = nSum%11;
//写回目标字符串,注意最后一位要查表写入。
for (k=0; k<17; k++)
dest[k] = data[k]+'0';
dest[17] = pEnd[tail];
dest[18] = '\0';
}
试了我自己的身份证,结果正确。
“根据索引6 对应的校验码位7”
不对,应该是从0开始数,对应的码是6.
执行结果:
请输入15位身份证号码:
510212711215041
修改后的身份证号码(18位):
510212197112150416
温馨提示:答案为网友推荐,仅供参考