第十二届蓝桥杯第四场模拟赛(填空题)

目录

1. 质数

2. ascii值对应的字符

3. 斐波那契数列

4. 树的节点数目

5. 最后一位身份证号


1. 质数

请问在1900到2020中有多少个质数?

思路分析:通过质数的定义求解就行,可以使用两层循环进行处理,最外层循环表示质数的范围,第二层循环是循环当前的质数可能的存在的因为,对于当前的质数i最大的因数为根号i,所以从2枚举到根号的i即可(包括根号i),在枚举的时候计数即可

if __name__ == '__main__':
    res = 0
    for i in range(1900, 2021):
        j, f = 2, 1
        while j * j <= i:
            if i % j == 0:
                f = 0
                break
            j += 1
        if f:
            res += 1
    print(res)

2. ascii值对应的字符

编码为80对应的字符?

思路分析:因为使用的是python语言,所以使用chr函数求解出ascii值对应的字符即可,chr函数传递进80ascii值即可

if __name__ == '__main__':
    print(chr(80))

3. 斐波那契数列

前100个斐波那契数列数中,有多少个是3的倍数?

思路分析:使用两个变量a, b迭代求解出第n个斐波那契数,b就为第n个斐波那契数,然后对当前求解斐波那契数列数判断是否是3的倍数满足则计数即可

if __name__ == '__main__':
    a, b = 1, 1
    res = 0
    for i in range(3, 101):
        a, b = b, a + b
        print(i, b)
        if b % 3 == 0:
            # print(b)
            res += 1
    print(res)

4. 树的节点数目

已知一棵二叉树有2021个叶节点,请问有这棵树至少有多少个节点?

对于这棵二叉树最少的节点数目为只有度数为0和度数为2的节点,但是因为叶子节点的数目为2021为奇数个所以肯定存在度为1的节点那么最终二叉树总的节点数目为n = n0 + n1 + n2 = 2021 + 1 + 2020 = 4042个节点

5. 最后一位身份证号

问题描述:
一个身份证号码有 18 位数字或字母组成。其中前17位必须是数字,最后一位可能是数字或字母X。身份证号码满足一定的校验规则。令身份证号从右到左依次标号为 1 到 18,其中标号为 i 的位的位权设置为 2^(i-1) mod 11 (2的i-1次方除以 11 的余数)。将每一位的数值乘以位权后相加,得到的结果除以 11 的余数应当为 1。其中最后一位(标号为1)中如果出现字母 X,看成数字 10。
例如,如果一个人的身份证号为 34052419800101001X,则:
标号为 1 的位,位权 1,数值 X,即 10,相乘得 10。
标号为 2 的位,位权 2,数值 1,相乘得 10。
标号为 3 的位,位权 4,数值 0,相乘得 0。
标号为 4 的位,位权 8,数值 0,相乘得 0。
标号为 5 的位,位权 5,数值 1,相乘得 5。
标号为 6 的位,位权 10,数值 0,相乘得 0。
标号为 7 的位,位权 9,数值 1,相乘得 9。
标号为 8 的位,位权 7,数值 0,相乘得 0。
标号为 9 的位,位权 3,数值 0,相乘得 0。
标号为 10 的位,位权 6,数值 8,相乘得 48。
标号为 11 的位,位权 1,数值 9,相乘得 9。
标号为 12 的位,位权 2,数值 1,相乘得 2。
标号为 13 的位,位权 4,数值 4,相乘得 16。
标号为 14 的位,位权 8,数值 2,相乘得 16。
标号为 15 的位,位权 5,数值 5,相乘得 25。
标号为 16 的位,位权 10,数值 0,相乘得 0。
标号为 17 的位,位权 9,数值 4,相乘得 36。
标号为 18 的位,位权 7,数值 3,相乘得 21。
将乘积相加,得 199,除以 11 的余数正好为 1。
小明的身份证号前 17 位为 11010120210221999,请问小明身份证的最后一位是多少?
答案提交:
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个字符,可能是数字或者大写字母X,在提交答案时只填写这个字符,填写多余的内容将无法得分。

思路分析:模拟题目描述的过程即可,题目的关键点为这句话:将每一位的数值乘以位权后相加,得到的结果除以 11 的余数应当为 1,所以我们可以循环遍历17位身份证号将对应位置的数值乘以位权的结果进行累加,最后使用一个1-10循环求解出哪一个数字加上n对11取余得到的结果为1输出这个数字即可。当我们编写好程序之后可以输出其中的位权与值看是否正确,并且通过题目中给出的例子看求解出的结果是否正确

答案:8

def solve(s: str):
    n = 0
    for i in range(len(s)):
        weight = 2 ** (17 - i) % 11
        n += weight * int(s[i])
        print("位权为:{}, 数值为{}".format(weight, s[i]))
    # 循环1-9的数字看哪一个是最后一个数字加上n对11取余为1
    for i in range(1, 11):
        if (n + i) % 11 == 1:
            print("最后一位数字为: ", i)


if __name__ == '__main__':
    s = "11010120210221999"
    solve(s)
    print("-" * 40)
    solve("34052419800101001")

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值