11月01日(第3天_回紋數、直方圖和質數)
阿新 • • 發佈:2019-01-31
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]]