建民打卡日记5.14

一、问题描述

一个合法的身份证号码由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
 

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

二、流程设计

  1. 录入身份证号;
  2. 对每个身份证号前17位求权重后的和;
  3. 对和模11;
  4. 根据模11后的数找到正确的校验位;
  5. 对身份证号第18位进行校验;
  6. 若有误则输出;
  7. 若n个身份证号中无错误,则输出all passed。

三、代码实现

#include <bits/stdc++.h>
using namespace std;

int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char m[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int z[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int main() {
	int n;
	cin >> n;

	int l = 0, temp = n;
	int k;
	while (n--) {
		string num;
		int sum = 0;
		cin >> num;
		for (int i = 0; i < 17; i++) {
			sum += a[i] * (num[i] - 48);
		}

		for (int i = 0; i < 11; i++) {
			if (num[17] == m[i])
				k = z[i];
		}
		if (sum % 11 == k)
			l++;
		else
			cout << num << endl;
	}
	if (l == temp)
		cout << "All passed";
}

 

posted @   cor0000  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示