C语言高手来帮帮忙了,将15为身份证号转化为18位

变换规律:1扩充6位出生年月为8位(年从两位扩充为4位)2校验码计算 前7位分别乘加权值,求和,取模(mod 11),通过校验列表取得校验位 各位加权值:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2, 各个校验位:10X98765432
例:如某人身份证扩充后51021219711215041 校验码计算:求和sum=5*7+1*9+0*10+2*5+1*8+2*4+1*2+9*1+7*3+1*3+1*7+2*9+1*10+5*5+0*8+4*4+1*2=204 将sum对11娶模:index=sum%11=6 根据索引6 对应的校验码位7 因此新的身份证号位:51021219711215041

#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
温馨提示:答案为网友推荐,仅供参考
相似回答