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 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球1 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
靠沿3 小时前
贪心算法专题(二)
算法·贪心算法
猎头南楼3 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生4 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂4 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康5 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备5 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.5 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫6 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构