前言
这道题对之前数学不好的人不怎么友好,我就是那个数学不好的人,概念了解后,这道题就没有难度了,很简单的一道15分。
L1-016 查验身份证
一个合法的身份证号码由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
好了,上面又给了一堆又大又长的题目,真的,这种题目看不下去直接,这个题目说了一个什么意思呢,就是给一串数字(身份证号),判断这串数字合不合理,根据前17个数字加权求和,然后对11取模与校验码对比,得出校验码与第18位做对比,一样的就是正确,不一样的就是错误。
这个题开始难道了加权求和上面,由于数学不太好,去查了加权求和的相关知识,不知道的小伙伴可以看一下下面
加权求和是一种数学运算,用于计算一组数值的加权平均值。每个数值都有一个对应的权重,权重表示该数值在总和中的重要性。加权求和的公式如下:
加权求和=w1⋅x1+w2·x2+⋯+wn·xn
其中
wi是第i个数值的权重
xi是第i个数值
n是数值个数
在这个题目里面,就是用身份证号对应位的值与权重对应位的值相乘然后全部相加
下面直接看看代码
代码
#include <stdio.h>
int main()
{
int num[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,i,t = 0,j,stop = 0;
scanf("%d",&n);//输入个数
char number[18];//身份证号
for(i = 0;i < n;i++)
{
t = 0;
scanf("%s",&number);//输入身份证号
for(j = 0;j < 17;j++)
t += (number[j]-'0')*num[j];//加权求和
t %= 11;//对11取模
if(m[t] != number[17])//判断是否一样,不一样直接输入,一样就跳过
{
stop = 1; //防止下面输出All passed ,校验
printf("%s\n",number);
}
}if(stop == 0)printf("All passed");
}
以上所有代码均为自己编写,本人水平有限,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论
上一题:团体程序设计天梯赛-练习集——L1-015 跟奥巴马一起画方块
下一题:团体程序设计天梯赛-练习集——L1-017 到底有多二