【全网严谨版】L1-016 查验身份证 (C++解法 整理分析了多种方法)

news2024/9/23 8:23:32

 问题描述

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

思路

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

 方法一

#include <iostream>
using namespace std;

int main()
{
    int qz[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 n;//表示录入n个身份证号
    cin>>n;
    string s[n];//n个身份证号
    for(int i=0;i<n;i++)
        cin>>s[i];
    int k=0;//记录有多少个错误
    int sum[n]={0};//权重和
    int mo[n];//权重和模11
    char jy[n];//正确的校验位

    /*对每个身份证号进行判断*/
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<17;j++)//求权重和
            sum[i]=sum[i]+(int)(s[i][j]-'0')*qz[j];
        mo[i]=sum[i]%11;//求权重模11
        jy[i]=m[mo[i]];//正确的校验位
        if(s[i][17]!=jy[i])//校验位进行检验
        {
            k++;
            cout<<s[i]<<endl;
        }
    }
    if(k==0)//录入无错误情况
        cout<<"All passed";
    return 0;
}

 但是,我的VS编辑器提示数组[]中必须为常量,不能为n,即使你前面已经由键盘输入n了。但是提交代码之后可以通过。

方法二

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int q[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //权值数组
    string M="10X98765432"; 
    /*  ↑↑↑结果对应数组,不嫌麻烦可以写成
    char M[11]={'1','0','X','9','8','7','6','5','4','3','2'};  */
    int Z; //前17位的加权和
    bool flag=true; //用来验证身份中号码中是否有效
    for(int i=0;i<n;i++)
    {
        Z=0;
        string id;
        cin>>id;
        for(int j=0;j<17;j++)
        {
            Z+=(id[j]-'0')*q[j]; //不需要笨拙的if语句来写
        }
        Z%=11;
        if(M[Z]!=id[17]) /*检验权重和对应数字是否等于最后一位数字
        不相等身份证无效*/
        {
            flag=false; 
            cout<<id<<endl; 
        }
    }
    if(flag==true) //全部样例都是有效身份证号码
    {
        cout<<"All passed"<<endl;
    }
    return 0;
}

 这个是从键盘每输入一个身份证号,然后判断它是否正确,这样确实简单了,只对单个的字符串进行判断即可,只涉及一维数组。如果身份证号错误,那么就是一行输入,下一行紧接着就是输出。

但是,要求的是随后N行都是输入的身份证号,根据这一点这个方法显然是不符合的。

【关键】最后提交上述代码之后,全部正确。由此可见,对于一些要求并没有那么的严格,只要所有的输入和输出符合条件即可,并不是得先把所有的输入完成之后才能进行输出。(个人看法)

方法三(更严谨点)

#include <iostream>
using namespace std;

int main()
{
	int qz[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };//权重
	char ma[11] = { '1','0','X','9','8','7','6','5','4','3','2' };//验证码
	int k = 0;//记录有多少个错误
	int n;//表示录入n个身份证号
	cin >> n;

	int m = 20;//m 相当于是身份证号的字符数,我给了个20,以防分配的空间不够
	//动态分配二维字符数组空间
	char **id = (char**)malloc(n * sizeof(char*));//这将分配一个 char 指针数组,其中包含 n 个 char 指针。每个指针可以指向一个字符串或字符数组。如果你的目标是存储多个字符串,这是正确的分配方式。
	for (int i = 0; i < n; i++) {
		id[i] = (char *)malloc(m * sizeof(char));
	}

	int *sum = (int*)malloc(n * sizeof(int));//动态分配一维数组空间
	int *mo = (int*)malloc(n * sizeof(int));//动态分配空间
	char *jy = (char*)malloc(n * sizeof(char));//动态分配空间

	//输入身份证号
	for (int i = 0; i < n; i++) {
		cin >> id[i];
	}

	/*对每个身份证号进行判断*/
	for (int i = 0; i < n; i++)
	{
		sum[i] = 0;
		for (int j = 0; j < 17; j++)//求权重和
			sum[i] +=  (int)(id[i][j] - '0')*qz[j];
		mo[i] = sum[i] % 11;//求权重模11
		jy[i] = ma[mo[i]];//正确的校验位
		if (id[i][17] != jy[i])//校验位进行检验
		{
			k++;
			cout << id[i] << endl;
		}
	}

	if (k == 0)//录入无错误情况
		cout << "All passed";

	//使用 free 函数来释放内存,以避免内存泄漏
	free(id);
	free(mo);
	free(sum);
	free(jy);
	return 0;
}

笔者感觉上述代码更严谨一点,更贴近题意,根据输入的n,紧接着输入n个身份证号,最后输出。

利用malloc动态分配数组空间,不会出现方法一中的VS编译错误情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、创建个人首页页面

简介 改造 App.vue 创建一个展示页面,实现一个可以轮播的功能效果。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:style.css、App.vue、assets 一、 自定义全局样式 将 style.css 中的文件样式内容替换为如下代码 /* 初始化样式 --------------------------…

《Java程序设计》实验报告

实验内容&#xff1a;面向对象程序设计 1、定一个名为Person的类&#xff0c;其中含有一个String类型的成员变量name和一个int类型的成员变量age&#xff0c; 分别为这两个变量定义访问方法和修改方法&#xff0c;另外再为该类定义一个名为speak的方法&#xff0c; 在其中输出n…

图书出版如何做好软文营销

在信息技术快速发展的时代&#xff0c;大部分人的阅读方式也从传统的纸媒演变为电子书阅读&#xff0c;在这种形势下&#xff0c;图书出版行业的经营模式、经营理念都面临着许多变革&#xff0c;那么在网络时代&#xff0c;图书出版行业应该如何做好软文营销呢&#xff1f;下面…

高频微观结构:日内及隔夜动量因子

本周天软因子序列课程暂时结束&#xff0c;感谢大家百忙之中参会交流&#xff01; 本次会议主要内容有&#xff1a; 1.介绍日内及隔夜动量因子的构造逻辑&#xff0c;如何选择市 场代理变量对动量因子进行改进; 2.结合因子研究平台分别分析动量因子、日内涨幅因 子、隔夜涨幅因…

【力扣每日一题】2023.9.7 修车的最少时间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数值&#xff0c;数组里每个元素表示一个老师傅&#xff0c;老师傅修车花费的时间等于数值乘上车辆数的平方。 问我们修理…

【Docker】镜像的创建、管理与发布

镜像的获取 镜像可以从以下方式获得&#xff1a; 从远程镜像仓库拉取&#xff0c;可以是公有仓库&#xff0c;也可以是私有仓库从Dockerfile构建从文件导入&#xff08;离线&#xff09;从容器提交 镜像的基本操作 跟镜像相关的命令如下&#xff1a; $ docker image --help…

linux 文件属性相关

文章目录 文件存储介绍文件颜色含义软链接和硬链接 文件目录操作压缩解压 tar目录切换 cd创建目录 mkdir删除目录 rmdir rm复制文件或目录 cp移动文件或目录 mv查看指定目录下的内容 ls文本查看 cat more tail文本编辑 vim 查找查找文件 find查找文本 grep查找文件 whereis Lin…

语义分割实践思考记录(个人备忘录)

一、任务管理器、NVDIA的GPU利用率显示[1][2] 若需要在任务管理器中查看基于Pytorch框架的GPU利用率&#xff0c;那么&#xff0c;我们需要将监控面板监测内容调整为cuda。图一&#xff08;左&#xff09;即为英伟达命令行工具面板。 图一 英伟达GPU使用率监控 二、基于混淆矩阵…

如何配置Header Editor

。什么是Header Editor 当我们通过网页自带inspect中的network找到返回的response之后&#xff0c;如果需要查看具体的response内容。Header Editor可以自动将response格式美化 。如何配置 1/ 首先需要通过chrome插件安装好Header Editor 2/ 点击网页右上角图标&#xff0c…

HAProxy终结TLS双向认证代理EMQX集群

文章目录 1. 背景介绍2. 系统架构3. 证书签发3.1 创建根证书3.2 创建中间证书3.3 创建设备证书3.4 创建服务端证书 4. HAProxy开启双向认证5. 验证6. 总结 1. 背景介绍 MQTT协议已经成为当前物联网领域的关键技术之一&#xff0c;当前市面上主流的实现MQTT协议的产品主要有 EMQ…

2023年高教社杯数学建模国赛C题详细版思路

C 题 蔬菜类商品的自动定价与补货决策 2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对C题进行解题思路说明&#xff0c;以分析C题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快找到C题的解题思路。 难度排…

第六章 图 三、图的存储结构(邻接表、十字链表、邻接多重表)

一、邻接表法 &#xff08;1&#xff09;无向图 1.定义 与树的孩子表示法相似&#xff0c;以顺序表的数据域为头结点&#xff0c;往后存储一个单向链表&#xff0c;链表内的值表示与此结点相邻的结点。 2.度的计算 只需遍历某一结点的后接链表&#xff0c;就可以算出该节点…

Linux命令200例:Yum强大的包管理工具使用(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

【Python小项目之Tkinter应用】随机点名/抽奖工具小优化:实现输入框人数限定与人名显示优化,保证结果人名在窗口内显示,如果内容显示超出则弹出警告窗口

文章目录 前言一、实现思路二、关键代码三、完整代码总结前言 老规矩,先看效果展示: 优化前: 对比来看,当显示人数较多时,优化前的窗口输出框在窗口分辨率不满足显示空间时,会造成人名显示不全的问题,而且只能单行显示,并无任何提示,这样会让用户误认为程序执行正确…

socket的使用 | TCP/IP协议下服务器与客户端之间传送数据

服务器端代码&#xff1a; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class theServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(9999); // 该行代码作用&#xff1…

Win7旗舰版64位桌面创建32位IE方法

很多Win7 64位旗舰版用户系统桌面上的IE8浏览器&#xff0c;打开后都是64位的&#xff0c;而很多网站并不兼容64位的IE浏览器&#xff0c;其实在Win764位系统中IE是分为64位和32位的&#xff0c;出现这样的情况可能是桌面上的IE图标指响的是64位的IE&#xff0c;我们只要重新添…

温控仪的工作原理

温控仪是调控一体化智能温度控制仪表&#xff0c;它采用了全数字化集成设计&#xff0c;具有温度曲线可编程或定点恒温控制、多重PID调节、输出功率限幅曲线编程、手动/自动切换、软启动、报警开关量输出、实时数据查询、与计算机通讯等功能&#xff0c;将数显温度仪表和ZK晶闸…

Discourse 应该保留多少备份

近期&#xff0c;我们在对 Discourse 进行恢复的时候&#xff0c;我们发现新的备份可能会导致不是所有的数据都能恢复到服务上。 这时候我们应该考虑让 Discourse 保留多少备份的问题&#xff1f; 在默认情况下&#xff0c;我们设置 Discourse 的备份是保留 5 个。这是官方的…

c语言初阶指针

目录 何为指针 地址大小 野指针 成因 如何规避 有效性 指针计算 -整数 ​编辑 指针比较运算 指针-指针 ​编辑 数组与指针关系 二级指针 指针数组 应用 何为指针 指针就是指针变量&#xff0c;用来存放内存空间的一个编号&#xff0c;将指针比作我们宾馆的客人&a…

Web存储

目录 什么是 HTML5 Web 存储? 方法 cookie webStorage 会话存储 sessionStorage 本地存储localStorage 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据。 早些时候,本地存储使用的是 cookie。但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服…