目錄
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")
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272491.html
標籤:python
