# Leo's計算機期末考複習
## 知識點
----
### 輸入語法
#### 文字轉數字串列
```python=
# 範例一 int 可以 換成 float
arr = list(map(int,input().solit()))
# 範例二 int 可以 換成 float 或是被去掉
arr = [int(i) for i in input().split()]
```
### print 輸出 (採用f-string)
1. 基本輸出
```python=
print(f"{var:參數} ....")#型式
# 範例一 小數點顯示前後兩位
print(f"{var:2.2f}")
print("%2.2f" %var) #用法相同
# 範例二 百分比顯示(註記:Python 可能會有誤差)
var = 0.9
print(f"{var:.2%}") #print 90.00%
print(f"{var:.0%}") #只顯示 小數點前面
# 範例三 字串顯示 串列
print(f"{string}")
print(f"{list_x}")
```
2.print 可帶參數sep(把串列用間隔字符連接起來) ,end (結尾加的參數)
```python=
print(".....",end = "\n")#預設 end 結尾是換行
#串列 好用功能 sep()
list_x = [1,2,3,4,5]
# output = 1+2+3+4+5
print(list_x,sep = "+") #連接串列用
```
### 常用函數
```python=
# 串列處理
arr = [1,2,3,4,5]
x = arr[:] #複製arr的串列內所有數值到x
x = arr[1:2] #
x = arr[::-1] #反向複製 arr內所有數值到x [5,4,....]
#####################
arr.index(x) # 返回數值為x的索引值
arr.append(1) # 在串列最後面加入數值1 =>[1,2,3,4,5,1]
arr.remove(1) #移除 最早出現為1的數值 =>[2,3,4,5,1]
#####################
arr.sort() #降序排列
arr.reverse() #串列倒過來 與 arr[::-1] 相同
######################
sum(list_x) # 陣列總和
max(list_x) # 數值最大
min(list_x) # 數值最小
abs(-1) # 返回絕對值
```
## 程式參考
### 1207 作業四
#### Print
#### 圓
---
注意小數點.2f
#### 分組問題
---
```python=
# 助教寫的會有小bug 當 number > 組數 才會成立
print('第 {} 組'.format((number-1)//g+1)) #
if number % 組數 != 0:
groupth = (number//組數)+1
else:
groupth = number//組數
print(f"第{groupth}組")
```
### 1214 作業五
#### Math
---
```python=
# def f(x,y) :
# return 2*x**3 + x*(y**2) + 2*x*y + 5*x
# 上下等價
f = lambda x, y: 2*x**3 + x*(y**2) + 2*x*y + 5*x
x = int(input("x : "))
y = int(input("y : "))
print(f"ans = {f(x,y)}")
```
#### 迴文
---
```python=
s = input("請輸入一段字串 : ").upper()
print(f"{s == s[::-1]}")
```
#### Calculate Score
---
*注意 輸入有可能是 float
```python=
name, s1 ,s2,s3 = input("").split(" ")
s1,s2,s3 = float(s1),float(s2),float(s3)
print(f"{name} 的總分為 {s1+s2+s3:.2f},平均值 {s1+s2+s3/3:.2f}") # 輸出
print(f"{name} 是否及格: {s1+s2+s3 >= (60)*3}")
```
#### Max Value
給定一個數字陣列 nums(不需使用 input 自行輸入),請自行選擇該陣列的不同索引值 i 和 j,找到 i 跟 j 可以滿足下式得到最大值。
```python=
nums.sort()
print(f"{(nums[-2] -1)*(nums[-1] -1)}")
```
#### 將數字變為 0
---
```python=
num = int(input("num = "))#轉成整數
time = 0
while num != 0 :
if num % 2 == 0 :# even
num = num // 2
else :# odd
num -= 1
time += 1
#輸出
print(f"{time}")
```
### 1221 作業六
#### 階乘
```python=
def factorial(n):
if n == 1 or n == 0 :
return 1
else :
return n * factorial(n-1)
```
#### Sum of Array
[1,2,3,4,5] => [1,3,6,10,15]
```python=
nums = [1,2,3,4,5]
runningSum = [0]*len(nums) #生成 num長度的串列
for i in range(len(nums)):
runningSum[i] = sum(nums[0:i+1])
print(f"Running Sum = {runningSum}")
```
#### 斐波納器數列
```python=
def fib(nth):
if nth == 0 or nth == 1 :
return nth
else:
return fib(nth - 1) + fib(nth - 2)
```
#### Balanced string
輸入一段僅包含 A、B 的字串,切割此字串,判斷這個字串有幾個相等數量的 A、B 字串。
**其實用for迴圈做會比較快,遞迴有點浪費時間**
```python=
def process(a, b, st, sum_of_parts):
# if we can't pop it that means me have done all the things ,so we can return it .
try:
temp = st.pop(0)
except:
return sum_of_parts
# count the number of A and B
if temp == 'A':
a += 1
else:
b += 1
if a == b:
sum_of_parts += 1
a = 0
b = 0
return process(a, b, st, sum_of_parts)
s = list(input("input:"))#字串切成串列
print(f"output: {process(0, 0, s, 0)}")
```
### 助教大補帖
---
#### 公英制轉換
```python=
cm = 172.72
inch = cm/2.54
print(f"{cm}公分 = {int(inch//12)}尺{int(inch%12)}吋")
```
#### 組合
```python=
def n_(n):
if n == 1 :
return 1
else :
return n*n_(n-1)
def C(n,k):
return n_(n)//(n_(k)*n_(n-k))
```
#### 有效括號
```python=
def Is_real(st, index, count):
if index == len(st): # 表示算完
if count == 0: # 剛好 平衡 (())(())
return True
else: # 有可能不平衡 (())((
return False
else: # 判斷
if st[index] == "(":
count += 1
else:
count -= 1
# 如果 小於1 直接return False 代表先出現左括號
if count < 0: #))((
return False
else:
# return 很重要 少了 return 最後的數值傳不回去
return Is_real(st, index + 1, count)
while 1:
braket = input("請輸入括號:")
if braket == 'q':
exit()
if Is_real(braket, 0, 0):
print("True")
else:
print("False")
```
#### 重疊總面積
```python=
def fill(A,rec):
Area = 0
for i in range(rec[0],rec[2]): # x範圍
for j in range(rec[1],rec[3]): # y範圍
if A[i][j]!= 1 :#沒被填過
A[i][j] = 1
Area += 1
return Area
if __name__ == '__main__':
n = int(input("n = "))
rec_n = []
for i in range(n):
# append [1 1 2 2] as rec[0] and so on
rec_n.append(list(map(int, input().split())))
# rec_n = [[1, 1, 10, 10], [5, 7, 25, 30],[10, 10, 40 ,35]]
Space = [[0 for i in range(51)] for j in range(51)]
Area = 0
for rec in rec_n:
Area += fill(Space, rec)
print(f"Area = {Area}")
```
#### 質數生成
```python=
# prime number
def isPrime(n):
if n % 2 == 0:
return False # 3 以後的偶數都不是質數
else:
for j in range(3,int(n**0.5)+1,2): # 判斷奇數就好
if n % j == 0:#到n-1 前只要有任何一個整除就不是質數
return False
# 度過驗證 就是 質數
return True
if __name__ == '__main__':
n = int(input("n = "))
print("2、", end="")
for i in range(3, n+1):
if isPrime(i):
print(f"{i}、", end="")
```