1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11,得到余数。 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
实现:
1.新建对话框程序,加入Edit Control(id为IDC_EDIT1),和一个button(id为IDC_BUTTON1)。设置编辑框属性Number为true,表示只接受数字。
2.在OnInitDialog()加入
// TODO: 在此添加额外的初始化代码
CFont *m_Font; m_Font = new CFont;
//设置编辑框字体大小 m_Font->CreateFont(30,10,0,0,100, FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,L"Arial"); CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1); m_Edit->SetFont(m_Font,FALSE); GetDlgItem(IDC_EDIT1)->SetFont(m_Font);
3.在OnBnClickedButton1()中加入
void CIdCheckDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 //系数 unsigned char multi[17] = {7 ,9 ,10 ,5 ,8 ,4 ,2 ,1 ,6 ,3 ,7 ,9 ,10 ,5 ,8 ,4 ,2}; int sum = 0; CString lastNum; //获取编辑框的值到编辑框变量 UpdateData(TRUE); CString PersonId; PersonId = m_id; int ll = PersonId.GetLength(); //验证长度 if (ll != 17) { MessageBox(_T("长度不正确!请输入身份证前17位!")); return; } //计算系数和 for (int i =0 ; i < ll ; i++) { sum += _ttoi(CString(PersonId.GetAt(i)))*multi[i]; } //计算余数 sum %= 11; if (sum == 1) lastNum = _T("0"); else if (sum == 0) lastNum = _T("1"); else if (sum == 2) lastNum = _T("X"); else { lastNum.Format(_T("%d"), 12-sum); } MessageBox(_T("该身份证最后一位为")+lastNum); }
4. 运行结果
注: 本程序只根据前17位验证最后一位的正确性,而不论该号码的真实性。