XTU-OJ 1323-身份证验证

校验

题目描述

第二代身份证号为18位,我们将身份证号定义为ID=a17a16⋯a0¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯,那么前17位ai,i=17,为数字0∼9,最后一位为校验位,为0∼9和X,X表示数值10。 校验公式为

∑i=017ai×2i≡1(mod11)

请写一个程序,对用户输入的身份证号码进行校验。

输入

第一行是一个整数K(K≤1000),表示样例的个数。 以后每行是一个18位的字符串,前17位为数字,最后一位为数字或者字母X。

输出

每个样例输出一样。如果校验通过,输出"Yes",否则输出"No"。

样例输入

复制代码
3 
431381198109106573 
43138119870827275X 
431381198708272759

样例输出

复制代码
Yes 
Yes 
No

**解题思路:**在ASCII码表中," : " 是在 ' 9 ' 之后的一个字符,所以用 ' : ' 替代 ' X ' 。

另外注意题目 a0 和 a17 的顺序,是a17在前面。(应该就我没看题.....) ,剩下的直接按校验公式 计算就行。

AC代码:

cpp 复制代码
#include <stdio.h>

int K,tag;
int two[20] = {1};
char Id[20];

int main()
{
    for (int i = 1; i < 18; i ++)               // 2的次幂
        two[i] = two[i-1]*2;
    scanf("%d",&K);
    while ( K --)
    {
        tag = 0;
        scanf("%s",Id);
        if (Id[17] == 'X')    Id[17] = ':';     // 利用ASCII码
        for (int i = 0; i < 18; i ++)           // 求和
            tag += (Id[i]-'0')*two[17-i];
        if (tag%11 != 1)    puts("No");
        else                puts("Yes");
    }
    return 0;
}
相关推荐
格林威1 分钟前
基于轮廓特征的工件分类识别:实现无模板快速分拣的 8 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·目标跟踪·分类·数据挖掘
Jasmine_llq2 分钟前
《UVA11181 条件概率 Probability|Given》
数据结构·算法·深度优先搜索(dfs)·剪枝(可行性剪枝)·组合枚举(递归暴力枚举)·条件概率统计与归一化
老鼠只爱大米8 分钟前
LeetCode算法题详解 560:和为K的子数组
算法·leetcode·前缀和·哈希表·子数组求和·subarraysum
MM_MS10 分钟前
Halcon小案例--->路由器散热口个数(两种方法)
人工智能·算法·目标检测·计算机视觉·视觉检测·智能路由器·视觉
小杨同学4910 分钟前
C 语言实战:超市水果结算系统(深度解析与优化)
后端·算法·设计
a3158238061 小时前
大语言模型应用开发技术要求
算法·大语言模型·应用开发
倦王1 小时前
力扣日刷26112
算法·leetcode·职场和发展
liu****1 小时前
能源之星案例
人工智能·python·算法·机器学习·能源
2501_901147831 小时前
环形房屋打家劫舍算法
考研·算法·leetcode·高考
智驱力人工智能1 小时前
守护矿山动脉 矿山皮带跑偏AI识别系统的工程化实践与价值 皮带偏离检测 皮带状态异常检测 多模态皮带偏离监测系统
大数据·人工智能·opencv·算法·安全·yolo·边缘计算