c语言题 身份证的奥秘

2023-12-18

题目 身份证的奥秘
题述无关部分已略
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai: 表示第i位置上的身份证号码数字值
Wi: 表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
15 位的 yy 年升为 18 位后,变成 19yy年,但对于百岁以上老人, 则为 18yy 年,此时,他们的最后三位顺序码为996, 997, 998 或 999 来标记。
输入格式:
输入n组身份证号码,第一行为个数,以后每行为身份证号码。
输出格式:
如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。
输入样例:
4
350622197904130331
11010519491231002X
110105491231002
110105491231996[回车]
输出样例:
Invalid[回车]
Valid[回车]
11010519491231002X[回车]
110105184912319965[回车]

以下是一个用C语言实现的解决方案:

#include <stdio.h>
#include <string.h>
 // 计算身份证校验位
char calculateCheckCode(const char *id) {
    int weights[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    char checkCodes[11] = "10X98765432";
    int sum = 0;
     for (int i = 0; i < 17; i++) {
        sum += (id[i] - '0') * weights[i];
    }
     int mod = sum % 11;
    return checkCodes[mod];
}
 // 将15位身份证号码升级为18位
void upgradeID(char *id) {
    char newID[19];
    strncpy(newID, id, 6);
    newID[6] = '1';
    newID[7] = '9';
    strncpy(newID + 8, id + 6, 9);
    newID[17] = calculateCheckCode(newID);
    newID[18] = '\0';
    strcpy(id, newID);
}
 // 验证身份证号码是否合法
int validateID(const char *id) {
    if (strlen(id) == 15) {
        char newID[19];
        strcpy(newID, id);
        upgradeID(newID);
        printf("%s\n", newID);
    } else if (strlen(id) == 18) {
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            if (id[i] < '0' || id[i] > '9') {
                return 0;
            }
            sum += (id[i] - '0') * (1 << (17 - i));
        }
        char checkCode = calculateCheckCode(id);
        if (id[17] == checkCode) {
            printf("Valid\n");
        } else {
            printf("Invalid\n");
        }
    } else {
        printf("Invalid\n");
    }
    return 1;
}
 int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        char id[19];
        scanf("%s", id);
        validateID(id);
    }
    return 0;
}
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言题 身份证的奥秘 的相关文章

  • 基于激光的迈克尔逊干涉仪和干涉条纹探测

    摘要 迈克尔逊干涉仪是光学干涉测量的典型装置 装置中的不同配置可能导致不同的干涉条纹 因此 它们之间的关系非常值得去深入研究 借助VirtualLab Fusion中的非序列追迹技术 可以轻松设置和配置迈克尔逊干涉仪 并在不同情况下显示干涉

随机推荐

  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明
  • 什么是consistency conditions

    什么是consistency conditions consistency stability convergence identifiability的关系 一致性 稳定性与收敛性 识别性 https blog csdn net Yana
  • 用于添加新内容的四个 jQuery 方法

    通过jQuery 可以很容易地添加新元素 内容 添加新的HTML内容 我们将学习用于添加新内容的四个jQuery方法 append 在被选元素的结尾插入内容 prepend 在被选元素的开头插入内容 after 在被选元素之后插入内容 be
  • ADP荣膺Everest Group、NelsonHall和Ventana Research评选为全球薪酬市场领导者

    中国上海 2023年12月18日 近日 在三家行业领先的分析机构发布的报告中 ADP 被评为全球薪酬市场的卓越领导者 这三份报告分别由Everest Group NelsonHall 和Ventana Research 现隶属于ISG 编写
  • 题解 | #浙江大学用户题目回答情况#

    快手测开二面面经 国企面经 多家 得物 测开 一面 中国联通陕西省分公司薪资待遇 京东健康前端实习一面凉经 求java推荐项目 面经回馈 秋招及实习历程中笔经 面经 时间梳理 国企银行 秒杀项目常见问题 终焉篇 双非本产品经理35w 终于来
  • 24届还有在看工作机会的吗,求求大家看下小米吧,HC非常多

    一定要反问HR的六个问题 offer比较 华为 vs OPPO 离谱的一周 百度裁应届 拼多多 非必要就别去了吧 阿里云25k gt 美团29k 实习转正啦 进来看耍猴 12 17更新 25届实习招聘信息汇总走起 策论 设计产出 Learn
  • js小技巧 时间格式化 年月日、时间格式化 年月日时分秒

    时间格式化 年月日 export function timestampToTime timestamp var date new Date timestamp 时间戳为10位需 1000 时间戳为13位的话不需乘1000 var Y dat
  • 一级浪涌保护器的行业应用解决方案

    一级浪涌保护器是防雷系统中最重要的一环 它主要用于建筑物总配电柜 低压变压器进线柜等位置 防止浪涌电压直接从外部传导进入内部 使系统设备免遭雷击损坏 一级浪涌保护器的规范要求 应用 作用和原理以及国标 本文将分别进行介绍 一 一级浪涌保护器
  • 快速处理EDI数据映射:知行EDI Profiler 操作指南

    一个完整的EDI项目通常由建立传输通道 处理数据映射以及集成内部业务系统三部分组成 对用户而言 基于知行之桥EDI系统进行自主实施最大的挑战便是处理数据映射 EDI报文读不懂 映射关系太复杂 这些问题给企业造成困扰的同时也阻挡了自主实施ED
  • Codeforces Round 915 (Div. 2) A-F(补题&补写法)

    A Constructive Problems 签到 题解 输出max x y t int input for in range t u v map int input split print max u v B Begginer s Ze
  • 最新AI创作系统ChatGPT系统源码+DALL-E3文生图+支持AI绘画+GPT语音对话功能

    一 AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统 支持OpenAI GPT全模型 国内AI全模型 本期针对源码系统整体测试下来非常完美 可以说SparkAi是目前国内一款的
  • Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)G. Nearest Fraction(有理实数求分母不超过n的最优逼近)

    题目 给一个不超过1的实数r r最多18位小数 和一个分母n n lt 1e10 求分母不超过n的与该有理实数的最优逼近 即二者绝对值之差最小 有理实数显然可以转成分数 思路来源 官方题解 farey序列论文 一类分数问题的研究 pdf 题
  • FL Studio21.2.2963水果音乐软件安装

    FL Studio是功能强大的音乐制作解决方案 使用旨在为用户提供一个友好完整的音乐创建环境 让您能够轻松创建 管理 编辑 混合具有专业品质的音乐 一切的一切都集中在一个软件中 只要您想 只要您需要 它总能满足您的音乐需求 工具方面 包括强
  • Git常用总结

    Git常用总结 Date August 6 2023 项目目前常用代码 常用总结 暂存所有文件 git add 提交版本记录 git commit m 将仓库文件提交到远程仓库 git push 查看版本号 git reflog 回退版本
  • 如何基于企业需求,又便宜又快地定制开发一套CRM客户管理系统?

    如何基于企业需求 又便宜又快地定制开发一套CRM客户管理系统 定制开发CRM客户管理系统是为了满足企业个性化需求而进行的 它可以帮助企业提高客户关系管理效率 提供更好的客户服务和实现精细化运营 本文将为大家介绍CRM定制开发的搭建流程以及如
  • 微积分的链式法则

    微积分的链式法则 两个函数相乘如何求导 https blog csdn net zhangyingjie09 article details 88620119 导数的四则运算法则之一的乘法 链式法则 导数的乘法 是不一样的哦
  • NodeJS药店药品进销存管理系统-计算机毕设 附源码 70874

    node js 药店药品进销存管理系统 摘 要 随着科学技术的飞速发展 各行各业都在努力与现代先进技术接轨 通过科技手段提高自身的优势 对于药店药品进销存管理系统当然也不能排除在外 随着网络技术的不断成熟 带动了药店药品进销存管理系统 它彻
  • 如何写一个二阶的偏微分方程?写一个混合偏微分方程。

    如何写一个二阶的偏微分方程 写一个混合偏微分方程 https blog csdn net ChenglinBen article details 95644133 二阶混合偏导 Second order mixed derivatives
  • 网络安全之等保 2.0 测评

    一 身份鉴别 a 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 1 登录 mysql 查看是否使用了口令和密码的组合鉴别身份 mysql h 192 168 100 16 u root p 2
  • c语言题 身份证的奥秘

    题目 身份证的奥秘 题述无关部分已略 1 十七位数字本体码加权求和公式 S Sum Ai Wi i 0 16 先对前17位数字的权求和 Ai 表示第i位置上的身份证号码数字值 Wi 表示第i位置上的加权因子 Wi 7 9 10 5 8 4