C++实现身份证号码过滤与排序

article/2025/9/28 7:23:50

1.描述

警察办案里检索到一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序,如果是错误的身份证号,则从排序列表中删除(仅需判断前两位省级地区编码是否在下面的列表中,以及对出生年月是否在1949.10.1-2022.10.1之间进行判断)。
备注:身份证号码为18位的数字组成,省级地区编码是第1到第2位,出生日期为第7到第14位。
身份证前两位各省对应的编号是:
11 北京市\12 天津市\13 河北省\14 山西省\15 内蒙古自治区
21 辽宁省\22 吉林省\23 黑龙江省
31 上海市\32 江苏省\33 浙江省\34 安徽省\35 福建省\36 江西省\37 山东省
41 河南省\42 湖北省\43 湖南省\44 广东省\45 广西壮族自治区\46 海南省
50 重庆市51 四川省52 贵州省53 云南省54 西藏自治区
61 陕西省62 甘肃省63 青海省64 宁夏回族自治区65 新疆维吾尔自治区
71 台湾省
81 香港特别行政区82 澳门特别行政区


*输入格式
第一行一个整数n,表示有n个身份证号码 (n<100)
余下的n行,每行一个身份证号码。 (已保证输入数字是18位)

*输出格式
按出生时间从大到小排序后的身份证号,每行一条 

*样例输入
8
466272199203271156 
21585619900709197X
21585620000228197X
234804198701078365
404475727700034980//【注:地区码不对】
710351199203313165
118698189201011234//【注:出生年份不对】
50123419831343135X//【注:出生月日不对】

*样例输出
234804198701078365
21585619900709197X
710351199203313165
466272199203271156

//

2.代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <algorithm>
// 使用脚本make.sh编译
/*
(仅需判断前两位省级地区编码是否在下面的列表中,以及对出生年月是否在1949.10.1-2022.10.1之间进行判断)。
备注:身份证号码为18位的数字组成,省级地区编码是第1到第2位,出生日期为第7到第14位。
身份证前两位各省对应的编号是:
11 北京市\12 天津市\13 河北省\14 山西省\15 内蒙古自治区
21 辽宁省\22 吉林省\23 黑龙江省
31 上海市\32 江苏省\33 浙江省\34 安徽省\35 福建省\36 江西省\37 山东省
41 河南省\42 湖北省\43 湖南省\44 广东省\45 广西壮族自治区\46 海南省
50 重庆市51 四川省52 贵州省53 云南省54 西藏自治区
61 陕西省62 甘肃省63 青海省64 宁夏回族自治区65 新疆维吾尔自治区
71 台湾省
81 香港特别行政区82 澳门特别行政区
*//*
描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。声明
下面是 atoi() 函数的声明。int atoi(const char *str)
参数
str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。*/
static const int ID_LEN = 18;
static const int YEAR_MIN = 1949;
static const int YEAR_MAX = 2022;
static const std::bitset<83>PROVINCE_CODES("11000000000100000111110000001111100011111100011111110000000111000001111100000000000");
struct id_info {id_info(const char *str) : id(str) {}bool parse_info() {if (id.size() != 18) {std::cerr << "error id size:" << id.size() << std::endl;return false;}code = (id[0] - '0') * 10 + id[1] - '0';if (code >= PROVINCE_CODES.size() || (false == PROVINCE_CODES.test(code))) {std::cerr << "error id code:" << code << std::endl;return false;}char tmp[8] = { 0 };memcpy(tmp, id.c_str() + 6, 4);year = atoi(tmp);memset(tmp, 0, sizeof(tmp));if (year < YEAR_MIN || year > YEAR_MAX) {std::cerr << "error id year:" << year << std::endl;return false;}memcpy(tmp, id.c_str() + 10, 2);month = atoi(tmp);memset(tmp, 0, sizeof(tmp));if (month < 1 || month > 12) {std::cerr << "error id month:" << month << std::endl;return false;}memcpy(tmp, id.c_str() + 12, 2);day = atoi(tmp);if (day < 1 || day > 31) {std::cerr << "error id day:" << day << std::endl;return false;}if (2 == month) {if ((0 == year % 4) && ((year % 100 != 0) || (0 == year % 400))) {if (day != 29) {std::cerr << "leap year:" << year << " error 2 month days:" << day << std::endl;return false;}}else {if (day != 28) {std::cerr << "non leap year:" << year << " error 2 month days:" << day << std::endl;return false;}}}return true;}std::string id;int code = 0;int year = 0;int month = 0;int day = 0;
};
class ids_process {
public:void add_id(const char *str) {if (!str) {return;}id_info info(str);if (true == info.parse_info()) {infos_.push_back(info);}}void sort_ids() {constexpr auto compare = [] (const id_info &info_one, const id_info &info_other) {if ((info_one.year == info_other.year) && (info_one.month == info_other.month) && (info_one.day == info_other.day)) {return info_one.id >= info_other.id;}else {if (info_one.year > info_other.year) {return true;}else if (info_one.year < info_other.year) {return false;}else if (info_one.month > info_other.month) {return true;}else if (info_one.month < info_other.month) {return false;}else return info_one.day >= info_other.day;}};std::sort(infos_.begin(), infos_.end(), compare);}void show_ids() const {std::cout << "=============show ids==============" << std::endl;for (auto &info : infos_) {std::cout << info.id << std::endl;}}
private:std::vector<id_info>infos_;
};
int main()
{int iCount = 0;const int MAX_LEN = 100;char id[MAX_LEN] = { 0 };printf("请输入身份证个数:");scanf("%d", &iCount);printf("\n");if (iCount > 100) {std::cerr << "invalid count:" << iCount << std::endl;return -1;}ids_process idsp;printf("请依次输入身份证:\n");getchar();for(int i=0; i<iCount; i++){fgets(id, ID_LEN + 1, stdin); // add \0idsp.add_id(id);getchar();	// accept \n}idsp.sort_ids();idsp.show_ids();return 0;
}

3.编译

Makefile:

src = $(wildcard ./*.cpp) # 获取当前目录下所有.cpp文件
objs = $(patsubst %.cpp, %.o, $(src)) # 字符串替换,将.cpp替换为.o,%表示任意字符串
target = idsort
INCLUDE := -I.
LIBS    := -lpthread
CFLAGS  := -g -Wall  $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -std=c++11 -DHAVE_CONFIG_H
$(target): $(objs)$(CXX)  $^ $(LIBS) -o $@ 
# $(CXX) 代表g++
# $^ 表示所有的依赖文件
# $@ 表示要生产的目标idsort.o: idsort.cpp$(CXX)  $(CXXFLAGS) -c $< -o $@.PHONY:clean  # clean不是一个要生成的文件,假目标
clean:rm *.o -f

4.运行测试

 


http://chatgpt.dhexx.cn/article/PIOflVJL.shtml

相关文章

基于MATLAB的身份证号码识别系统

一、课题目标 本文主要介绍了一种采用基于matlab数字图像处理的图像识别技术&#xff0c;对身份证原始图像中的序列号标示进行图像识别的方法。该系统通过图像预处理、图像定位、图像校正并最终输出结果。在系统调试阶段&#xff0c;根据遇到的错误即时对原系统进行调整&#x…

python爬虫--根据身份证号码获取户籍地、出生年月等信息

一、背景 工作中偶尔会遇到这样的情况&#xff0c;给你一堆客户身份证号码&#xff0c;然后要你把对应的性别、生日、户籍地等信息弄出来。 最常用的方法就是用excel表套公式&#xff0c;这个方式如果用来取性别、生日这些信息的话问题不大&#xff0c;毕竟这些规则还好梳理&…

BP算法的身份证号码识别

摘 要:基于反向传播算法的多层前馈网络(简称BP神经网络)在图像处理方面应用较为广泛。目前&#xff0c;身份证号码识别技术 在图像识别领域迅猛发展&#xff0c;为提高识别身份证号码的速度及准确性&#xff0c;本文研究一种基于BP神经网络的身份证号码识别系统。首 先&#xf…

Matlab实现身份证号码快速识别

用Matlab 实现身份证号码快速识别 摘 要&#xff1a; 探讨身份证号码的快速识别。 首先从身份证图像中获取 0&#xff5e;9 共 10 个号码数字的样本图像&#xff0c; 从中提取其空间分布特征和结构特征&#xff1b; 再从待识别的身份证图像中提取各号码数字的空间分布特征和结构…

身份证号码的编码规则及校验

前言 本文内容适用于二代身份证&#xff0c;如无特殊说明&#xff0c;本文中所说的身份证皆指二代身份证。 笔者目前使用的jdk版本是1.6.0_29&#xff0c;Eclipse版本是Juno Release&#xff0c;Build id 20120614-1722。如无特殊说明&#xff0c;本文所有的Java代码都是基于…

基于Python实现身份证号码验证

基于Python实现身份证号码验证 摘要: 该设计主要使用python语言来实现身份证号验证程序。它运用 tkinter模块生成GUI界面。当用户输入身份证号&#xff0c;按下检查按钮&#xff0c;即可判断身份证号是否正确。该程序简洁&#xff0c;灵活&#xff0c;执行效率高。 关键词: 身…

java验证身份证号码的合格性

中国居民身份证校验码算法步骤如下: 将身份证号码前面的17位数分别乘以不同的系数。从第一位到第十七位的系数分别为: 7&#xff0d;9&#xff0d;10&#xff0d;5&#xff0d;8&#xff0d;4&#xff0d;2&#xff0d;1&#xff0d;6&#xff0d;3&#xff0d;7&#xff0d;9&…

Python+Opencv身份证号码区域提取及识别

前端时间智能信息处理实训&#xff0c;我选择的课题为身份证号码识别&#xff0c;对中华人民共和国公民身份证进行识别&#xff0c;提取并识别其中的身份证号码&#xff0c;将身份证号码识别为字符串的形式输出。现在实训结束了将代码发布出来供大家参考&#xff0c;识别的方式…

身份证号码案例

我国的居民身份证号码&#xff0c;由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法&#xff0c;并在主方法中调用方法测试结果。规则为&#xff1a;号码为18位&#xff0c;不能以数字0开头&#xff0c;前17位只可以是数字&#xff0c;最…

Python之身份证号码的校验

该文章已同步收录到我的博客网站&#xff0c;欢迎浏览我的博客网站&#xff0c;xhang’s blog 问题描述&#xff1a; 中华人民共和国居民身份证号码由17 位数字和1位校验码组成。 其中&#xff0c;前6位为所在地编号&#xff0c;第7~14 位为出生年月日&#xff0c;第15~17位为登…

JAVA 身份证号码的验证

一、身份证结构和形式 在通用的身份证号码有15位的和18位的&#xff1b; 15位身份证号码各位的含义: 1、1-2位省、自治区、直辖市代码&#xff1b; 2、3-4位地级市、盟、自治州代码&#xff1b; 3、5-6位县、县级市、区代码&#xff1b; 4、7-12位出生年月日,比如670401代…

等价类划分测试—身份证

目录 0.题目要求&#xff1a; 注意&#xff1a;一个测试用例只能覆盖一个无效等价类&#xff0c;但可以覆盖尽可能多的前面未覆盖到的有效等价类。 1.划分等价类 1.1有效等价类 1.2无效等价类 2.测试用例&#xff1a; 0.题目要求&#xff1a; 针对国内18位身份证号码验证…

二维码文件分析

将二维码保存&#xff0c;进行解码 进行base64解码,网址&#xff1a;https://www.sojson.com/base64.html。第一次解码&#xff1a;6LZ5Liq5bCx5piv6aqM6KB56CB77yaQkozNVVCNVNZNg 第二次解码&#xff1a;这个就是验证码&#xff1a;BJ35UB5SY6 得到key

Base64[再谈Base64] -- 附练习源代码

我打赌当你见到Base64这个词的时候你会觉得在哪里见过&#xff0c;因为在你能够上网看到这篇文章的时候你已经在后台使用它了。如果您对二进制数有所了解&#xff0c;你就可以开始读它了。 打开一封Email&#xff0c;查看其原始信息&#xff08;您可以通过收取、导出该邮件用文…

KgoUI(3) 之 vue + Sass

框架源代码&#xff1a;码云 直接上步骤&#xff1a; 第一&#xff1a;sass需要的模块 &#xff08;没有安装cnpm 就用 npm咯&#xff09; cnpm install --save-dev sass-loader cnpm install --save-dev node-sass cnpm install --save-dev sass-resources-loader…

安卓项目实战之强大的网络请求框架okGo使用详解(四):Cookie的管理

Cookie概念相关 具体来说cookie机制采用的是在客户端保持状态的方案&#xff0c;而session机制采用的是在服务器端保持状态的方案。同时我们也看到&#xff0c;由于采用服务器端保持状态的方案在客户端也需要保存一个标识&#xff0c;所以session机制是需要借助于cookie机制来…

Windows下安装Ginkgo测试框架

终端执行命令 #切换至GO安装路径 cd F:\Go\goProject\src\github.com F:#安装Ginkgo及其附加库 go get github.com/onsi/ginkgo/ginkgo go get github.com/onsi/gomega结果安装其附加库时开始报错 package golang.org/x/net/html/charset: unrecognized import path "g…

HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out.

python 下载第三方库的时候一直报错怎么办&#xff0c; pip --default-timeout1000 install -U pip 尝试了延时操作依然不行&#xff0c;不能获取 这种情况有可能是你开了VPN或者是其他的软件&#xff0c;退出下载即可

Go:构建应用程序的10大框架

文章目录 简介一、CLI 命令(spf13/cobra)二、配置读取器(spf13/viper)三、Web 框架(labstack/echo)四、依赖注入(uber-go/fx)五、Swagger Generator, UI 和 Validation1. Swagger generator (swaggo/swag)2. Swagger UI (swaggo/echo-swagger)3. Swagger validation (go-swagge…