身份证号升级程序
问题描述:根据给定的转换规则将输入的15位身份证号转化为18位的身份证号码!要求考虑程序用命令行参数输入15位身份证号码数字模型或问题分析
15位身份证各位的含义:510121(行政区代码)711215(出生年月)04(流水号)1(男女标志)
6位地区代码+6位出生码+3位顺序码(男为奇数,女为偶数)
18位身份证号码的含义
510121(行政区代码)19711215(出生年月)04(流水号)1(男女标志)6(校验码)
6位地区码+8位出生日期码+3位顺序码+1位校验码
变换规律
1。扩充6位出生年月为8位出生年月(年从两位扩充为4位)
2.校验码计算
前17位分别乘加权值,求和,取模(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*6+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 7(校验码)
#include<stdio.h>
void main(void)
{
char ID_15[16],ID_18[19];
int ctr,sum=0,mul[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char end_char[13]="10X987654321";
printf("根据给定的转换规则将输入的15位身份证号转化为18位的身份证号码!\n\n请输入15位身份证号:");
input:
scanf(" %s",ID_15);
if(strlen(ID_15)!=15)
{
printf("身份证号不是15位!请重新输入."); // 注释:输入15位,不是则重新输入。
goto input;
}
for(ctr=0;ctr<15;ctr++) //把15位转移到18位的字符串中,预留两位世纪位。
{
if(ctr>5)
{ID_18[ctr+2]=ID_15[ctr];}
else
{ID_18[ctr]=ID_15[ctr];}
}
ID_18[6]='1'; //考虑到实际情况,默认为世纪为19。21世纪后的身份证号均带世纪位,不作考虑
ID_18[7]='9';
for(ctr=0;ctr<17;ctr++)
{sum+=(mul[ctr]*((int)ID_18[ctr]-48));} //计算加权值
sum%=11;
ID_18[17]=end_char[sum-1]; //代入校验位
ID_18[18]='\0'; //插入NULL 0,结束字符串