| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1370 人关注过本帖
标题:身份证号升级程序
只看楼主 加入收藏
cracker134
Rank: 2
等 级:等待验证会员
帖 子:18
专家分:13
注 册:2010-6-15
收藏
 问题点数:0 回复次数:4 
身份证号升级程序
问题描述:根据给定的转换规则将输入的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,结束字符串
搜索更多相关主题的帖子: 身份证 
2010-06-15 14:47
weijiahao
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-6-15
收藏
得分:0 
顶一个
2010-06-15 23:44
DePrince
Rank: 2
等 级:论坛游民
帖 子:13
专家分:35
注 册:2010-6-14
收藏
得分:0 
呵~楼主辛苦了,顶一个!
2010-06-16 00:10
cracker134
Rank: 2
等 级:等待验证会员
帖 子:18
专家分:13
注 册:2010-6-15
收藏
得分:0 
问题描述:根据给定的转换规则将输入的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
例如:输入:510212711215041
校验码计算:
求和: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>
int main()
{
    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[12]="10X98765432";
    printf("根据给定的转换规则将输入的15位身份证号转化为18位的身份证号码!\n\n请输入15位身份证号:");

    do
    {
        scanf(" %s",ID_15);
        if(strlen(ID_15)!=15)
        {
            printf("身份证号不是15位!请重新输入.");        //输入15位,不是则重新输入。
        }
    }while(strlen(ID_15)!=15);

    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,结束字符串
    printf("%s-->%s\n",ID_15,ID_18);
    return 0;
}

2010-06-23 21:25
木禾
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-7-20
收藏
得分:0 
辛苦了
嘿嘿
2010-07-20 10:21
快速回复:身份证号升级程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017967 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved