# 虎科大 資管盃初賽心得&錯題
## 格式化輸出
### **題目 #忘記抄題ㄌ:)**
大概是:輸入兩個整數,先輸出一個叫 *12345678901234567890* 的尺標,再把兩字串分別靠左和靠右輸出。
### 程式碼
```python
a = int(input())
b = int(input())
str2 = ('{:·<10}'.format(a))+('{:·<10}'.format(b))
str1 = ('{:·>10}'.format(a))+('{:·>10}'.format(b))
print(12345678901234567890)
print(str1)
print(str2)
```
### 解法
利用''.format()指令,將字串向左和向右對齊。
格式:
```python
"{:>10}".format(123) >>將123在長為10的空間內向右對齊(>向右、<向左)
#輸出 ·······123
```
在冒號和大於/小於之間可以加上想要在空格填入的字符,例如:
```python
"{:'+'>10}".format(123)
#輸出 123+++++++
```
### 我學到
**format格式化**輸出的方法
---
## 進階分式加總
### 題目
由使用者輸入正整數 n 值 (已知n>2),然後計算下面公式值,注意:總和取到小數點第2位。
提示輸出:1/3+3/5+5/7+...+(n-2)/n
### 程式碼
```python
n = int(input())
ans = 0
for i in range(int(n/2)):
ans += (2*i+1)/(2*i+3)
print(f'{2*i+1}/{2*i+3}', end='')
if(i != int(n/2)-1):
print('+', end='')
print(f'={ans:.2f}')
```
### 解法
**法1:利用format格式化進行四捨五入輸出**
若要把123.4567四捨五入到小數後兩位,可以輸入:
```python
'{:.2f}'.format(123.4567)
#輸出 123.46
```
此處的2f是指把小數點後第2位,f是指float *意義同C#中float a = 0.2f*
若要四捨五入至其他位數,例如個位數:
```python
'{:.0f}'.format(123.4567)
#輸出 123
```
下為format四捨五入的參數對照表:
| 小數點下2位 | 小數點下一位 | 個位數 | 十位數 | 百位數 |
| ----------- | ------------ | ------ | ------ | -------- |
| '{:.2f}' | '{:.1f}' | '{:.0f}' | '{:.-1f}' | '{:.-2f}'|
剩下以此類推
**法2:利用round()函式進行四捨五入**
round()格式:
```python
round(浮點數, 取到的位數)
```
輸出條件同上:
```python
round(123.4567, 2)
#輸出 123.46
```
**!!注意!!**
若未指定要四捨五入到第幾位,則會預設四捨五入到個位數。
### 我學到
**round()用法、format四捨五入用法**
---
## 等差數列判別
### 題目
請連續輸入3個整數,然後自動判斷他們是否為等差數列。
### 程式碼
```python
a = int(input())
b = int(input())
c = int(input())
if a-b == b-c:
print(f'{a} {b} {c} 為等差數列')
else:
print(f'{a} {b} {c} 不為等差數列')
##輸出:2 4 6 為等差數列
```
### 解法
題目本身非常簡單,但問題是他的輸出若要用sep=和end=寫會很麻煩且難以閱讀,所以我請教同學得到了這個方法─ f-string
f-string格式:
```python
print(f'{變量or欲值執行的運算} 隨意想加的字串')
```
### 我學到
**f-string**輸出格式
---
## 計算與判斷
### 題目
輸入兩數a, b,若兩數相差超過5,則輸出兩數相乘,且若計算結果大於100則輸出"100+";反之則相廚,解若計算結果有小數,則輸出"有小數"、若相等則輸出兩數相加乘根號7,取小數第二位
### 程式碼
```python
a = int(input())
b = int(input())
if(a == b):
print(round((a+b)*(7**0.5), 2))
elif(abs(a-b) > 5):
print(a*b, end='')
if(a*b > 100):
print(',100+', end='')
print('')
else:
if('.' in str(a/b)):
print(round(a/b, 16), ',有小數', sep='')
else:
print(int(a/b))
```
### 解法
判斷是否為小數的方法>>
**法1: if n%1 != 0**
若整數n除以1的餘數不等於0,即n含有小於1的部分,也就是小數。
**法2: if '.' in str(n)**
把整數n換成字串,判斷n裡是否含有'.',如果有的話,n就是小數。
### 我學到
**小數的判別法**
---
## 質因數分解
### 題目
請撰寫一程式,讓使用者輸入一個正整數,輸出該數的質因數分解式子,質因數請由小而大相乘;若為質數,請輸出「-1」。
### 程式碼
```python
n = int(input())
prime = []
ans = []
a = n
t = 0
for i in range(2, n+1): ##質數表
if all(i%j != 0 for j in range(2, i)):
prime.append(i)
if n in prime:
print(-1)
else:
print(f'{n}=', end='')
for k in prime:
if a%k == 0: #找到質因數
t += 1
if t != 1:
print('*', end='')
print(k, end='')
a = int(a/k)
while a%k == 0:
print(f'*{k}', end='')
a = int(a/k)
print('')
```
### 解法
首先,我先將從1到n的所有質數找出來,用於後續找各質因數的次數用。
```python
for i in range(2, n+1): ##質數表
if all(i%j != 0 for j in range(2, i)):
prime.append(i)
把2到n以i迭代,分別除以2~(i-1)。
因為若i不是j[2~(i-1)]的倍數,則i只有1和i本身這兩個因數,即i是質數。
```
再來,我比對質數表,如果n在1~n的質數表內,即n是質數。
```python
if n in prime:
print(-1)
```
若不是質數,則拿質數表內每一個元素去除n。
```python
else:
print(f'{n}=', end='') #輸出 6=
for k in prime: #迭代質數表的每一個元素
if a%k == 0: #如果n(代換為a計算)可以被某質數k整除,就輸出k >>6=k
if t != 1: #又如果這次不是第一個數字
print('*', end='') #則補上一個*
a = int(a/k) #更新a的值
while a%k == 0: #繼續運算次數
print(f'*{k}', end='')
a = int(a/k)
print('') #最後輸出\n以符合格式
```
### 我學到
**質數的判斷法**
---