PTA L1-016 查验身份证(详解)

2023-10-27

前言:本期是关于查验身份证的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗?

 题目:

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

代码实现: 

#include<stdio.h>
int main()
{
    int weight[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 = 0;
    scanf("%d",&n);
    int i = 0;
    char id[19]={0};
    int flag=0;
    for(i=0;i<n;i++)
    {
        scanf("%s",id);
        int sum = 0;
        int illegal=0;
        int j = 0;
        for(j=0;j<17;j++)
        {
            if(id[j]>='0' && id[j]<='9')
            {
                sum+=(id[j]-'0')*weight[j];
            }
            else
            {
                illegal=1;
                break;
            }
        }
        if(illegal==1 || m[sum%11]!=id[17])
        {
            printf("%s\n",id);
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("All passed\n");
    }
    return 0;
}

大致思路:

预备了解:

id数组:存储身份证号码

sum:存储身份证前17位数字加权求和的值

illegal:检验身份证号码中是否有非数字字符

flag:检验身份证号是否全部正确

1. 遍历每一个身份证号码,若是发现号码中存在非数字的符号,则标记

2. 若是全部身份证号码循环结束后未发现非数字符号的存在,则显示All passed

3. 打印错误的身份证号码分两种:

    a. 存在非数字字符

    b.  身份证最后一位与对应的校验码值不等

代码解读:

part 1   判断一个身份证号码的全部字符
 

        for(j=0;j<17;j++)
        {
            if(id[j]>='0' && id[j]<='9')
            {
                sum+=(id[j]-'0')*weight[j];
            }
            else
            {
                illegal=1;
                break;
            }
        }

遍历一个身份证的所有字符,若是当前字符是非数字字符,结束此轮循环

                                                若是当前字符是数字字符,则加权求和

注意:我们存储身份证号码是以字符串的形式存储的,即身份证的组成全部被看成一个一个的字符

字符不能直接进行数字的相加减,故而我们需要把当前字符转成对应的数字,再来加权求和

字符转成数字:

字符-'0'=数字     

如:'1’-'0’=1       因为'1'的ASCII码值是49,'0’的ASCII码值是48,二者相减=1

part 2  打印错误身份证号码

        if(illegal==1 || m[sum%11]!=id[17])
        {
            printf("%s\n",id);
            flag=1;
        }

错误的身份证号码:

号码中有不是数字的 or 身份证最后一位与校验码不等

若是错误号码需要标记 

 part 3 

    if(flag==0)
    {
        printf("All passed\n");
    }

在所有的身份证号码判断结束后,若是检验身份证号是否全部正确的flag仍为0

则表示全部的身份证号码正确

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PTA L1-016 查验身份证(详解) 的相关文章

  • Parti 水记

    Parti 水记 Scaling Autoregressive Models for Content Rich Text to Image Generation 主页 https parti research google 论文 https
  • 【图像处理】【图像去模糊】 总结

    本人最近由于做相关去卷积工作 查阅了上百篇文献 发现在这个领域 可能也是 水太深 了 并没有一篇较好的综述 现在做以下总结 只对高斯与散焦模糊的非盲去卷积领域 对于运动模糊并未做总结 但实际上除了点扩散函数的估计有区别 实际上这三类去模糊甚
  • Dart基础语法2

    类 mixin 被mixin 混入 的类不能有构造函数 class A void a print A 的a方法 class B void b print b方法 void a print B 的a方法 满足了我们的多继承的需求 class
  • 运维架构

    首先 后端程序及客户端都是分成三个版本 内部测试版 线上测试版 线上稳定版 线上测试版是小范围更新 经过一天测试没问题 然后再推到线上稳定版 更新其他服 一般游戏也都是按这个流程来更新的 运维管理后台 记录了区服信息 提供各种简单API接口
  • Linux脚本和环境变量

    目录 一 可执行脚本 二 脚本程序解释器 三 SHELL语言 四 shell语言的变量 1 环境变量 2 用户环境变量 一 可执行脚本 脚本script 是一种解释执行的程序 linux中有三种常见的脚本 Shell脚本 sh Python

随机推荐

  • 第八章 基于项的图形视图

    对于用户自定义的窗口部件和绘制一个或者几个项来说 使用QPainter是理想的 在绘图中 如果需要处理从几个到几万个项时 而且要求用户能够单击拖动选取想 Qt的视图类提供了这一解决方案 Qt的视图体系包括一个由QGraphicsScene充
  • javafx事件总线之EventBus

    JAVAFX EventBus是一个轻量级的事件总线框架 用于在JavaFX应用程序中实现基于事件的通信和解耦 它提供了一种简单的方式 让组件能够订阅和发布事件 从而使得应用程序中的各个组件能够相互通信 而不需要相互依赖 JAVAFX Ev
  • node require报错为936的解决方式之一

    node internal modules cjs loader 936 Error Cannot find module crypto js 1 有一种是 你去检查一下你npm下面的node modules是不是又多了个node modu
  • SQL使用视图的优缺点

    INNER JOIN left Join 联接多个表 关于SQL的执行计划 查看SQL语句的具体执行过程 工作原理 SQL使用视图的优缺点 2010 06 04 10 56 43 分类 SQL 标签 字号大中小 订阅 在做数据库开发中使用视
  • 【华为OD机试题】最低位排序 Java代码实现

    题目描述 给定一个非空数组 列表 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素 相对位置保持不变 当数组元素为负值时 十进制最低为等同于去除符号位后对应十进制值最低位 输入 给定一个非空数组 列表
  • (二十三)槽函数的书写规则导致槽函数触发2次的问题

    在创建QT的信号和槽时 经常无意间保留着QT书写槽函数的习惯 或者在QT设计界面直接右键 转到槽 去创建槽函数 但是后期需要用到disconnect时 又重新写了一遍connect函数 那么你会发现实际槽函数执行了2遍 首先来看下这种QT的
  • JavaScript属性描述符【待补充】

    前言 很多学习过vue的同学 在学习vue响应式数据 或者双向绑定 的原理时 都接触过get set Object defineProperty这句个函数 并且大概知道它们的用法 但是一提到属性描述符 大家就很陌生了 今天详细的给大家讲解一
  • c++11新特性之独占指针unique_ptr

    独占智能指针unique ptr 独占智能指针不允许其他智能指针共享内部的指针 可以通过它的构造函数初始化一个独占智能指针对象 但是不允许通过赋值将一个unique ptr赋值给另一个unique ptr unique ptr不允许复制 但
  • ns2仿真学习(二)-tcp拥塞窗口的跟踪

    本文主要处理 1 的输出结果 仿真脚本 basic1 tcl basic1 tcl simulation A R B Create a simulator object set ns new Simulator Open the nam f
  • Hadoop完全分布式集群搭建(超详细)

    目录 1 1 1 完全分布式介绍 1 1 2 平台软件说明 1 1 3 守护进程布局 1 2 1 集群搭建准备 1 2 2 总纲 1 2 3防火墙关闭 1 2 4 主机映射 1 2 5 免密登陆 1 2 6 jdk安装和hadoop安装及环
  • MySQL优化浅析

    1 场景简介 最近在使用Storm做日志的分析处理 众所周知 Storm是流式的处理框架 也就是每次只能处理和看到一条日志 然而做分析的时候 不可避免的要进行一些统计操作 如统计一分钟内某个ip的访问频率或者某个uid的访问频率等 于是我就
  • jquery html 清除样式,jquery怎么移除css样式

    jquery移除css样式的方法 1 通过使用 removeClass 方法去除css样式 2 通过使用 attr 方法或 css 去除单个css样式 本文操作环境 Windows7系统 jquery3 2 1版 DELL G3电脑 1 使
  • mybatis框架下select带in批量查询,返回结果集顺序与in不一致问题

    mybatis框架下select带in批量查询 返回结果集无序问题
  • 使用mybatis时paramType传入参数总结

    mybatis中SQL接受的参数分为 1 基本类型 2 对象 3 List 4 数组 5 Map 无论传哪种参数给mybatis 他都会将参数放在一个Map中 如果传入基本类型 变量名作为key 变量值作为value 此时生成的map只有一
  • Unhandled exception: Unable to determine ZooKeeper ensemble

    zookeeper hbase开启并正常 但是运行报错 17 04 24 20 13 23 ERROR master HMaster Region server icosa4 60020 1493045002304 reported a f
  • 金蝶,「起舞」在大模型时代

    在过去的几年时间里 基于EBC的平台能力 金蝶已经走出了一个新的进化之路 这条路是对自身产品竞争力的重新构建 也更是对企业数字化转型需求的更大程度满足 如今 苍穹GPT大模型更是让这种竞争力和服务力更向前一步 作者 皮爷 出品 产业家 6个
  • 2016腾旭研发工程师笔试题

    用C C 代码算出满足上述条件的值 我们首先来分析一下 step0 我们可以得到如下方程 step1 由方程 1 3 6 可得 我们可以把x1 x5 x6看成自变量 x2 x8 x7看成对应的函数 这样只要x1 x5 x6确定了 x2 x8
  • 常见的垃圾回收机制总结

    如何工作 在某些 Java 虚拟机中 堆的实现截然不同 它更像一个传送带 每分配一个新对象 它就向前移动一格 这意味着对象存储空间的分配速度特别快 Java 的 堆指针 只是简单地移动到尚未分配的区域 所以它的效率与 C 在栈上分配空间的效
  • (Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

    1 代码功能 输入 一个字符串 输出 codeword 码值 codeword所占的位数 2 代码框图 3 代码超详解 统计字符串中的字符种类 调用函数 放入数组b中 b unique str1 统计每种字符的个数 放入数组a中 for i
  • PTA L1-016 查验身份证(详解)

    前言 本期是关于查验身份证的详解 内容包括四大模块 题目 代码实现 大致思路 代码解读 今天你c了吗 题目 一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为