魔天记双修牧云仙邪恶:c++实现18位身份证校验码的计算公式 →『华夏编程区』 华夏联盟论坛
来源:百度文库 编辑:九乡新闻网 时间:2024/05/02 08:02:07
c++实现18位身份证校验码的计算公式,居民身份证的号码是按照国家的标准编制的,由18位组成:前六位为行政区划代码,第七至第十四位为出生日期码,第15至17位为顺序码,第17位代表性别(奇数为男,偶数为女),第18位为校验码。
作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
(1)十七位数字本体码加权求和公式
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示号码字符从右至左包括校验码字符在内的位置序号
Ai:表示第i位置上的身份证号码字符值
Wi:表示第i位置上的加权因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)Y值对应的校验码字符值:
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
试算一个:身份证号是14010519590215222a1
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Ai: 1 4 0 1 0 5 1 9 5 9 0 2 1 5 2 2 2 a1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
根据公式 S = Ai * Wi=7+36+0+5+0+20+2+9+30+27+0+18+10+25+16+8+4=217
217/11=19+8/11
Y = mod(S, 11)=mod(217,11)=8
所以,检验码为4,该人的身份证号为140105195902152224
程序c++
#include
using namespace std;
const int factor[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加权因子
const int checktable[] = { 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 };//校验值对应表
int checkIDinput( char[] );
void checkID( int[], char[] );
int main()
{
char ID[ 19 ];
int IDNumber[ 19 ];
cout << "输入身份证号码:";
cin >> ID;
while( !checkIDinput( ID ) ) //防止输入过程中位数输入错误
{
cout << "错误ID,重新输入:";
cout << "输入身份证号码:";
cin >> ID;
}
for ( int i = 0; i < 18; i ++ )//相当于类型转换
IDNumber[ i ] = ID[ i ] - 48;
checkID( IDNumber, ID );
system( "pause" );
return 0;
}
int checkIDinput( char ID[] )//检验身份证是否为18位
{
if ( strlen( ID ) == 18 )//字符串最后一位\0
return 1;
else return 0;
}
void checkID( int IDNumber[], char ID[] )
{
int i = 0;//i为计数
int checksum = 0;
for ( ; i < 17; i ++ )
checksum += IDNumber[ i ] * factor[ i ];
if ( IDNumber[ 17 ] == checktable[ checksum % 11 ] || ( ID[ 17 ] == 'x' && checktable[ checksum % 11 ] == 2 )) cout << "正确身份证号码\n";
else cout << "错误身份证号码\n";
}
作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
(1)十七位数字本体码加权求和公式
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示号码字符从右至左包括校验码字符在内的位置序号
Ai:表示第i位置上的身份证号码字符值
Wi:表示第i位置上的加权因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)Y值对应的校验码字符值:
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
试算一个:身份证号是14010519590215222a1
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Ai: 1 4 0 1 0 5 1 9 5 9 0 2 1 5 2 2 2 a1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
根据公式 S = Ai * Wi=7+36+0+5+0+20+2+9+30+27+0+18+10+25+16+8+4=217
217/11=19+8/11
Y = mod(S, 11)=mod(217,11)=8
所以,检验码为4,该人的身份证号为140105195902152224
程序c++
#include
using namespace std;
const int factor[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加权因子
const int checktable[] = { 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 };//校验值对应表
int checkIDinput( char[] );
void checkID( int[], char[] );
int main()
{
char ID[ 19 ];
int IDNumber[ 19 ];
cout << "输入身份证号码:";
cin >> ID;
while( !checkIDinput( ID ) ) //防止输入过程中位数输入错误
{
cout << "错误ID,重新输入:";
cout << "输入身份证号码:";
cin >> ID;
}
for ( int i = 0; i < 18; i ++ )//相当于类型转换
IDNumber[ i ] = ID[ i ] - 48;
checkID( IDNumber, ID );
system( "pause" );
return 0;
}
int checkIDinput( char ID[] )//检验身份证是否为18位
{
if ( strlen( ID ) == 18 )//字符串最后一位\0
return 1;
else return 0;
}
void checkID( int IDNumber[], char ID[] )
{
int i = 0;//i为计数
int checksum = 0;
for ( ; i < 17; i ++ )
checksum += IDNumber[ i ] * factor[ i ];
if ( IDNumber[ 17 ] == checktable[ checksum % 11 ] || ( ID[ 17 ] == 'x' && checktable[ checksum % 11 ] == 2 )) cout << "正确身份证号码\n";
else cout << "错误身份证号码\n";
}
c++实现18位身份证校验码的计算公式 →『华夏编程区』 华夏联盟论坛
如何知道黑客是否入侵过你的电脑 华夏联盟 华夏联盟论坛 —— 中国网络安全门户网站 专业提...
运行命令集锦 华夏联盟 华夏联盟论坛 —— 中国网络安全门户网站 专业提供网络安全相关资源
妙法莲花的帖子 华夏中医论坛
身份证的校验码为什么是除11啊?
蒙古国,关于蒙古国的问答 |三军沙龙 - 华夏网 华夏网论坛 - Powered by P...
巴基斯坦与中国的真实关系 |三军沙龙 - 华夏网 华夏网论坛 - Powered by P...
ARM Bootloader的实现 ---C和ASM混合编程
打鼾的中医治疗 - 疾病咨询 - 华夏中医论坛
UNIX下ORACLE数据库的创建-PHP编程-华夏名网资讯中心 虚拟主机,域名注册,双线...
华夏民族的常识
华夏民族的形成
【华夏的传统标志
华夏龙的首页
条形码校验码公式
为自己的asp网站系统构建一套标记语言_asp技巧-ASP编程-华夏名网资讯中心 虚拟主机...
享誉华夏的中华老字号
《华夏掠影》攀冰者的盛宴
华夏族的演变历程
华夏文明的五次浩劫
黄河流域的古华夏文明
华夏文明的白种来源
《华夏掠影》昨天的城
华夏版图的奠基者