每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399
身份证号的校验身份证号码共18位,最后一位是校验位A[18] : aaaaaabbbbbbbbcccd
校验的规则是如下:
前十七位的权值分别是:
x=(A[0]*W[0]+A[1]*W[1]+A[2]*W[2]+...+A[16]*W[16]) mod 11x和校验位y的对应规则对应如下:
y:1 0 x 9 8 7 6 5 4 3 2
若y等于d则身份证号码正确
输出格式:aaaaaabbbbbbbbcccd 正确
若y不等于d则身份证号码不正确
输出格式:应为:aaaaaabbbbbbbbcccy
输入格式:
身份证号码
输出格式:
身份证号码 正确或者不正确输入样例:
52242619811105565x
输出样例:
52242619811105565x 正确
解决方法:
(1)算法的基本思想:
需要解决的问题:
问题1:验证输入的身份证的位数,是否是18位
问题2:身份证校验位的确定
(2)代码实现:
#include <iostream>
using namespace std;
int main()
{
//输入权值数组
int W[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//校验位对照表
char check[] = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
cout << "请输入您的18位身份证号:" << endl;
char A[17] = {'0'};
cin >> A;
//验证输入的身份证号是否为18位
int num = strlen(A);
//cout << num << endl;
if (num != 18) {
cout << "身份证号输入不完全,请再次输入。";
return 0;
}
//创建辅助数组,将前17位存到辅助数组中
int B[17] = {0};
for (int i = 0; i < 17; i++)
B[i] = (int)A[i] - 48;
//计算前17位的权值之和MOD11
int sum = 0;
for (int j = 0; j < 17; j++)
sum += W[j] * B[j];
int x = sum % 11;
int y = check[x] - 48;
if (check[x] == A[17])
{
cout << A;
cout << " "
<< "正确" << endl;
system("pause");
return 0;
}
else
{
for (int i = 0; i < 17; i++)
cout << B[i];
if (check[x] == 'x')
cout << 'x' << endl;
else
cout << y << endl;
system("pause");
return 0;
}
return 0;
}
二分查找{-36 -25 0 12 14 29 35 47 76 100},对上述十个数进行二分查找。
输入样例:
请输入您要查找的数据:
14
-25
121
输出样例:
14是第5个数,查找次数为1。
-25是第2个数,查找次数为2。
查找失败。