介紹18位身份證號(hào)碼最后一位校驗(yàn)碼的計(jì)算方法
公民身份號(hào)碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗(yàn)碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。
校驗(yàn)方法:
(1)十七位數(shù)字本體碼加權(quán)求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先對(duì)前17位數(shù)字的權(quán)求和
Ai:表示第i位置上的身份證號(hào)碼數(shù)字值
Wi:表示第i位置上的加權(quán)因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)計(jì)算模
Y = mod(S, 11)
(3)通過模得到對(duì)應(yīng)的校驗(yàn)碼
???? Y: 0 1 2 3 4 5 6 7 8 9 10
校驗(yàn)碼: 1 0 X 9 8 7 6 5 4 3 2
下面是C程序代碼:
//????????char szSrc1[]="11010519491231002X";
//????????DoVerify(szSrc1);
//????????char szSrc2[]="440524188001010014";
//????????DoVerify(szSrc2);
char DoVerify(const char* pszSrc)
{
????int iS = 0;
????int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
????static char szVerCode[]="10X98765432";
????int i;
????for(i=0;i<17;i++)
????{
????????iS += (int)(pszSrc[i]-'0') * iW[i];
????}
????int iY = iS%11;
//????printf("%d %% 11 = iY = %d\n",iS, iY);
//????printf("%c \n",szVerCode[iY]);
????return szVerCode[iY];
}
from:http://dev.csdn.net/article/63/63451.shtm
posted on 2007-12-04 17:32
我風(fēng) 閱讀(1587)
評(píng)論(2) 編輯 收藏 引用