原题
公民身份号码是居住在我国公民都拥有的唯一的、终身不变的身份代码,它由18位数字组成,包含公民的地址、出生日期、出生顺序和校验码。其中校验码是通过前17位数字计算得出,可以方便快捷地检测一个18位的身份证号码是否正确。
校验码计算方式:号码的前17位数字,每位数字n均对应一个系数,为2(18-n)除以11取得的余数。例如第1位数字的系数为 2(18-1)%11=7。将前17位数字分别乘以对应系数并求和,将得到的结果除以11取余数,再用12减去得到的余数,减完再对11取余,最终结果即为身份证号的校验码。若最终结果为10,则校验码记为X,仍为18位。
现在已知一个数字组合,请你编写一段程序验证校验码是否正确。
输入一个长度等于18的字符串,存在在变量【数字组合】中,如下图:
输出一个布尔值,为true时即为通过验证,为false则不通过验证。存储在变量【是否通过验证】中,如下图:
解释
🌈 介绍
嗨,小朋友们!你们知道身份证号码是什么吗?它是一个特别的号码,每个大人都有一个,就像一个独一无二的身份标签。身份证号码有18位数字,最后一位可能是数字或者一个特别的字母“X”。但你知道这些数字是怎么工作的吗?让我们一起学习如何检查这个号码是否正确。
🎨 身份证号码的秘密
身份证号码不是随便的数字,它们有特别的含义。前面的数字告诉我们一个人的生日和他们住在哪里,而最后一位数字(或“X”)是一个“校验码”,用来检查前面的数字是否有错误。
🍭 如何检查校验码
检查校验码有点像做数学题。我们用前17位数字,每个数字乘以一个特别的数字,然后把它们加起来。这个特别的数字叫做“系数”,我们是这样计算它的:用2乘以一个数(这个数是18减去数字的位置),然后除以11取余数。
听起来有点复杂?别担心,我们来看一个例子:
假设我们有这样一个身份证号码:12345678901234567X。我们要做的是:
- 对前17位数字,每一位都乘以一个系数。
- 把所有乘出来的结果加起来。
- 用加起来的结果除以11,得到一个余数。
- 用12减去这个余数,再对11取余,就得到了我们的校验码。
如果计算出来的校验码和身份证上的最后一位一样,这个号码就是对的!
🚀 Python帮手
我们可以用Python,一种计算机语言,来帮我们做这个检查。这样我们就不用手算啦!Python可以帮我们计算系数,加起来,然后告诉我们校验码对不对。
这是用Python检查身份证号码的一个例子:
# 这是我们的检查函数
def validate_identity_code(identity_code):
# 首先,我们检查号码是不是18位
if len(identity_code) != 18:
return False
# 然后,我们开始计算
total = 0
for i in range(17):
# 对每一位数字乘以系数
total += int(identity_code[i]) * (2 ** (17 - i) % 11)
# 最后,我们计算校验码
calculated_check_digit = (12 - (total % 11)) % 11
calculated_check_digit = 'X' if calculated_check_digit == 10 else str(calculated_check_digit)
# 检查计算出的校验码是不是和身份证上的一样
return identity_code[-1].upper() == calculated_check_digit
# 这里,我们可以输入一个身份证号码来测试
test_identity_code = "12345678901234567X"
is_valid = validate_identity_code(test_identity_code)
print(is_valid)
🛸 Scratch帮手
对于还没有学过Python的小朋友,这里是使用Scratch实现的一个例子:
在好学好教的OJ平台上,已经收录了这道题,试题编号为6901,有账号的同学可以进去挑战一下,分别使用Python、C++和Scratch尝试一下,我们的OJ系统支持Scratch的算法的自动判题。
下面是这道题在OJ系统上的Scratch界面:
关于如何在好学好教少儿编程平台的OJ系统中使用Scratch答题,可以参考这篇说明《好学好教少儿编程平台OJ系统使用说明(学生版本)》。