1031 查验身份证——15分

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式

输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出“All passed”。

输入样例1

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1

12010X198901011234
110108196711301866
37070419881216001X

输入样例2

2
320124198808240056
110108196711301862

输出样例2

All passed

| 代码长度限制 | 时间限制 ||内存限制 |
|16 KB | 400 ms | 64 MB |

思路:
①先用用数组分别将权重和校验码M用两个数组储存起来,储存M的数组的下标即对应Z值
②每输入一个字符串就立刻进行遍历,如果是数字就乘上权重计入sum中,如果发现前17位中某一位不是数字,立刻结束对当前字符串的判断,输出它并且cnt++,进入下个串的输入与判断,如果前17位都没有问题,那么遍历之后的sum也就是加权求和的结果,用sum对11取余,判断c[sum%11]是否等于字符串的最后一位,不等于则输出它并且cnt++
③若cnt为0输出All passed

代码:

#include<bits/stdtr1c++.h>
using namespace std;
int main() {
	int num[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};    //存权重
	char c[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};  //存校验码
	int n, cnt = 0;  //cnt记录不合格的身份证数量
	string s;
	cin >> n;
	getchar();  //当输入完数字需要换行输入字符串时,用getchar()吸收回车
	for (int i = 0; i < n; i++) {
		int sum = 0; //sum用于求权重和
		getline(cin, s);  //读入字符串
		for (int i = 0; i < 17; i++) {
			if (!isdigit(s[i])) {
				cout << s << endl;
				cnt++;  //不合格的身份证数加一
				goto door; //goto到下方的continue,直接跳过本轮所有的判断和计算
			} else {
				sum += (s[i] - '0') * num[i]; //转成数字再乘以权重并累加入sum
			}
		}
		if (c[sum % 11] != s[17]) {  //判断结果是否和最后一位相等
			cout << s << endl;
			cnt++;
		}
		door:
			continue;
	}
	if (cnt == 0) cout << "All passed";
	return 0;
}
posted @   Fare-Well  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示