北京理工大学上机题——身份证验证

北京理工大学上机题——身份证验证

题目描述:
身份证号的校验身份证号码共18位,最后一位是校验位A[17]:aaaaaabbbbbbbbccc d校验的规则是如下:
前十七位的权值分别是:W[17]:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
x=(A[0]*W[0]+A[1]*W[1]+…+A[16]*W[16])mod11
x和校验位y的对应规则如下:
x:0 1 2 3 4 5 6 7 8 9 10
y:1 0 x 9 8 7 6 5 4 3 2
若y等于d则身份证号码正确
输出格式:aaaaaabbbbbbbbcccd 正确
若y不等于d则身份证号码不正确
输出格式:应为:aaaaaabbbbbbbbcccy
测试用例:
52242619811105565x
533325199108247066
需要解决的问题:
(1)验证输入的身份证的位数,是否是18位;
(2)身份证校验位的确定。

#include<iostream>
using namespace std;
int main() {
	char A[18] = { '0' };
	cout << "输入身份证号:";
	cin >> A;
	//验证身份证位数,如果位数不为18则退出
	int num = strlen(A);
	if (num != 18) {
		cout << "身份证号输入错误!" << endl;
		exit(1);
	}
	int W[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
	char jiaoyan[11] = { '1','0','x','9','8','7','6','5','4','3','2' };
	int x = 0;
	for (int i = 0;i < 17;i++) {
		//计算x,把A中的字符先转换为int型再进行计算
		x += (int)(A[i] - '0') * W[i];
	}
	x = x % 11;
	//计算出x对应的y
	char y = jiaoyan[x];
	if (A[17] == y) {
		cout << A << " 正确" << endl;
	}
	else {
		cout << "身份证错误,应为:";
		for (int i = 0;i < 17;i++)
			cout << A[i];
		cout << y << endl;
	}
	return 0;
}

运行测试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了50 篇原创文章 · 获赞 50 · 访问量 2938

猜你喜欢

转载自blog.csdn.net/weixin_45295612/article/details/105383644