1. 程式人生 > >11月01日(第3天_回紋數、直方圖和質數)

11月01日(第3天_回紋數、直方圖和質數)

Morning

1. 5位數的回紋數檢測

解答:

#方法一:
num = 12321
num1 = str(num)
a = ['*' for i in range(len(num1)//2+1) if  num1[i] == num1[-(i+1)] ]
if len(a)==len(num1)//2+1:
    print('此數有回紋[1]')

#方法二:不需要用列表推導式
num = 12321
num1 = str(num)
if num1 == num1[::-1]:
     print('此數有回紋[2]')

2. 對t = [10,15,20,5]畫直方圖

解答:

  • 方法一:
t = [10,15,10,5]
for i in t:
    print(['*']*i)

輸出如下:

['*', '*', '*', '*', '*', '*', '*', '*', '*', '*']
['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*']
['*', '*', '*', '*', '*', '*', '*', '*', '*', '*']
['*', '*', '*', '*', '*']
  • 方法二:
t = [10,15,10,5]
matrix = ['*'
*i+' '*(max(t)-i) for i in t ] matrix

輸出如下:

['**********     ', 
 '***************', 
 '**********     ', 
 '*****          ']

3. 把上一個題目畫的直方圖轉過來

解答:

  • 方法一:
t = [5,20,15,17]

high = max(t)
width = len(t)

#生成矩陣
u1 = [' ',]*width #這裡的複製也要注意
u = []
i = 1
while i<=high:
    u.append(u1.copy())#這裡一定要留意 
#錯誤程式碼:u = u.append(u1.copy()) #錯誤原因:'NoneType' object has no attribute 'append' i = i+1 # print(u) for k in range(width): i = t[k] j = high-1 while i != 0: u[j][k]='*' i = i - 1 j = j - 1 u

輸出如下:

[[' ', '*', ' ', ' '],
 [' ', '*', ' ', ' '],
 [' ', '*', ' ', ' '],
 [' ', '*', ' ', '*'],
 [' ', '*', ' ', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 [' ', '*', '*', '*'],
 ['*', '*', '*', '*'],
 ['*', '*', '*', '*'],
 ['*', '*', '*', '*'],
 ['*', '*', '*', '*'],
 ['*', '*', '*', '*']]
  • 方法二:
t = [10,15,10,5]
matrix = ['*'*i+' '*(max(t)-i)  for i in t ]

for i in range(len(matrix[0])-1,-1,-1):
    print([x[i] for x in matrix])

輸出如下:

[' ', '*', ' ', ' ']
[' ', '*', ' ', ' ']
[' ', '*', ' ', ' ']
[' ', '*', ' ', ' ']
[' ', '*', ' ', ' ']
['*', '*', '*', ' ']
['*', '*', '*', ' ']
['*', '*', '*', ' ']
['*', '*', '*', ' ']
['*', '*', '*', ' ']
['*', '*', '*', '*']
['*', '*', '*', '*']
['*', '*', '*', '*']
['*', '*', '*', '*']
['*', '*', '*', '*']

Afternoon

5. 寫出100以內的所有素數。

解答:

#自己寫的不對,只是判斷了這個數是否為質數
num = 11
a = []
for i in range(2,num):
    if num%i!=0:
        a.append('*')   #如果等於0就為True,這樣不好,因為接下來不能判斷一個布林表示式列表裡只要有False結果就是False,只能判斷這個列表是否為空
    else:
        a.append('#')  #說明能整除

# print(a)
if '#'in a:
    print(str(num)+'不是素數')
else:
    print(str(num)+'是素數')

正確程式碼:

x = 100
from math import sqrt
N = x
li = [p for p in range(2,N) if 0 not in [p % d for d in range(2,int(sqrt(p)) + 1)]]
print(li)

輸出如下:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

6. 任何一個偶數都能寫成兩個素數的和。

解答:

x = 100
from math import sqrt
N = x
li = [p for p in range(2,N) if 0 not in [p % d for d in range(2,int(sqrt(p)) + 1)]]

half_prime = [t for t in li if t <= x//2+1]
[[i,x-i] for i in half_prime if x-i in li]

輸出如下:

[[3, 97], [11, 89], [17, 83], [29, 71], [41, 59], [47, 53]]

7. 把列表arrs=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]變為[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]。

解答:

arrs = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

#方法一:類似直方圖的方法
for i in range(len(arrs[0])):
    print([x[i] for x in arrs])

#方法二:用zip方法
[list(item) for item in list(zip(*arrs))]

輸出如下:

[1, 4, 7, 10]
[2, 5, 8, 11]
[3, 6, 9, 12]
Out[4]:
[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]