天天看點

算法刷題系列(三)藍橋杯python基礎練習3

- 特殊的數字

資源限制

時間限制:1.0s 記憶體限制:512.0MB

問題描述

153是一個非常特殊的數,它等于它的每位數字的立方和,即153=111+555+333。程式設計求所有滿足這種條件的三位十進制數。

輸出格式

按從小到大的順序輸出滿足條件的三位十進制數,每個數占一行。

  • 解答程式
import math
for i in range(100, 1000):
    single = i % 10
    ten = (i % 100) // 10
    hundred = i // 100
    if i == math.pow(single, 3) + math.pow(ten, 3) + math.pow(hundred, 3):
        print(i)
           
  • 經驗教訓

    1、math提供pow可以快捷計算幂次。

    2、//為整數除法,可以抹去小數點。

- 回文數

資源限制

時間限制:1.0s 記憶體限制:512.0MB

問題描述

1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進制數。

輸出格式

按從小到大的順序輸出滿足條件的四位十進制數。

  • 解答程式
for i in range(1000, 10000):
    sin = i % 10
    ten = (i % 100) // 10
    hun = (i % 1000) // 100
    tho = i // 1000
    if tho == sin and ten == hun:
        print(i)
           
  • 經驗教訓

    無。

- 特殊回文數

資源限制

時間限制:1.0s 記憶體限制:512.0MB

問題描述

123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。

輸入一個正整數n, 程式設計求所有這樣的五位和六位十進制數,滿足各位數字之和等于n 。

輸入格式

輸入一行,包含一個正整數n。

輸出格式

按從小到大的順序輸出滿足條件的整數,每個整數占一行。

樣例輸入

52

樣例輸出

899998

989989

998899

  • 解答程式
# 特殊回文數
n = int(input())
for i in range(10000, 1000000):
    sin = i % 10
    ten = (i % 100) // 10
    hun = (i % 1000) // 100
    tho = (i % 10000) // 1000
    wan = (i % 100000) // 10000
    bil = i // 100000
    number_sum = sin + ten + hun + tho + wan + bil
    if bil == 0:
        if n == number_sum:
            if sin == wan and ten == tho:
                print(i)
    else:
        if n == number_sum:
            if sin == bil and ten == wan and hun == tho:
                print(i)
           
  • 經驗教訓

    1、在已經做了一部分剪枝的情況下,CPU使用時間依然達到了671ms,比較危險。

    2、可以考慮拆分for循環,先找出等于n的值,再考慮回文,不知道會不會有速度上的改進。

- 十進制轉十六進制

資源限制

時間限制:1.0s 記憶體限制:512.0MB

問題描述

十六進制數是在程式設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符号,分别表示十進制數的0至15。十六進制的計數方法是滿16進1,是以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。

給出一個非負整數,将它表示成十六進制的形式。

輸入格式

輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647

輸出格式

輸出這個整數的16進制表示

樣例輸入

30

樣例輸出

1E

  • 解答程式
# 十進制轉十六進制
a = int(input())
temp_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
tar = ""
while a > 15:
    pos = a - a // 16 * 16
    tar = temp_list[pos] + tar
    a = a // 16
else:
    tar = temp_list[a] + tar
print(tar)
           
  • 經驗教訓

    1、由于python沒有switch語句,最初是使用elif寫的,代碼極其冗長,後想到類似疊代的方法,便使用了一個temp_list的清單來通路數字對應。事實上,switch的數字對應相當于清單索引,其他字段相當于對應字典的鍵值對,确實不需要switch。唯一缺點是記憶體占用,不過本題不存在該問題。

    2、進制轉換不要把0忘了。。

    3、注意字元串先後順序。

繼續閱讀