一道GESP Scratch算法模拟题

原题

公民身份号码是居住在我国公民都拥有的唯一的、终身不变的身份代码,它由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。我们要做的是:

  1. 对前17位数字,每一位都乘以一个系数。
  2. 把所有乘出来的结果加起来。
  3. 用加起来的结果除以11,得到一个余数。
  4. 用12减去这个余数,再对11取余,就得到了我们的校验码。

如果计算出来的校验码和身份证上的最后一位一样,这个号码就是对的!

🚀 Python帮手

我们可以用Python,一种计算机语言,来帮我们做这个检查。这样我们就不用手算啦!Python可以帮我们计算系数,加起来,然后告诉我们校验码对不对。

这是用Python检查身份证号码的一个例子:

  1. # 这是我们的检查函数
  2. def validate_identity_code(identity_code):
  3. # 首先,我们检查号码是不是18位
  4. if len(identity_code) != 18:
  5. return False
  6. # 然后,我们开始计算
  7. total = 0
  8. for i in range(17):
  9. # 对每一位数字乘以系数
  10. total += int(identity_code[i]) * (2 ** (17 - i) % 11)
  11. # 最后,我们计算校验码
  12. calculated_check_digit = (12 - (total % 11)) % 11
  13. calculated_check_digit = 'X' if calculated_check_digit == 10 else str(calculated_check_digit)
  14. # 检查计算出的校验码是不是和身份证上的一样
  15. return identity_code[-1].upper() == calculated_check_digit
  16. # 这里,我们可以输入一个身份证号码来测试
  17. test_identity_code = "12345678901234567X"
  18. is_valid = validate_identity_code(test_identity_code)
  19. print(is_valid)

🛸 Scratch帮手

对于还没有学过Python的小朋友,这里是使用Scratch实现的一个例子:

在好学好教的OJ平台上,已经收录了这道题,试题编号为6901,有账号的同学可以进去挑战一下,分别使用Python、C++和Scratch尝试一下,我们的OJ系统支持Scratch的算法的自动判题。
下面是这道题在OJ系统上的Scratch界面:

关于如何在好学好教少儿编程平台的OJ系统中使用Scratch答题,可以参考这篇说明《好学好教少儿编程平台OJ系统使用说明(学生版本)》。


微信扫一扫,分享此文章

少儿编程教学平台

联系我们

微信

aguibo002

邮箱

haoxuehaojiao在163.com

Loading
我们已经收到您的信息,将尽快联系您!