---
# System prepended metadata

title: Leo's計算機期末考複習

---

# 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="")
```