# TQC Python3 參考解答
#### Creator: 蔣天誠
<hr>
# Python 第1類:基本程式設計
## **101:整數格式化輸出**
```python
n1 = int(input())
n2 = int(input())
n3 = int(input())
n4 = int(input())
print("|%5d %5d|"%(n1, n2))
print("|%5d %5d|"%(n3, n4))
print("|%-5d %-5d|"%(n1, n2))
print("|%-5d %-5d|"%(n3, n4))
```
## **102:浮點數格式化輸出**
```python
n1 = float(input())
n2 = float(input())
n3 = float(input())
n4 = float(input())
print("|%7.2f %7.2f|"%(n1, n2))
print("|%7.2f %7.2f|"%(n3, n4))
print("|%-7.2f %-7.2f|"%(n1, n2))
print("|%-7.2f %-7.2f|"%(n3, n4))
```
## **103:字串格式化輸出**
```python
n1 = input()
n2 = input()
n3 = input()
n4 = input()
print("|%10s %10s|"%(n1, n2))
print("|%10s %10s|"%(n3, n4))
print("|%-10s %-10s|"%(n1, n2))
print("|%-10s %-10s|"%(n3, n4))
```
## **104:圓形面積計算**
第一解
```python
pi = 3.14159
Radius = float(input())
Perimeter = Radius * 2 * pi
Area = pi * Radius **2
print("Radius = %.2f"%(Radius))
print("Perimeter = %.2f"%(Perimeter))
print("Area = %.2f"%(Area))
```
第二解法 導入 math 套件解法
```python
import math
Radius = float(input())
Perimeter = Radius * 2 * math.pi
Area = math.pi * math.pow(Radius, 2)
print("Radius = %.2f"%(Radius))
print("Perimeter = %.2f"%(Perimeter))
print("Area = %.2f"%(Area))
```
## **105:矩形面積計算**
```python
Height = float(input())
Width = float(input())
Perimeter = (Height + Width) * 2
Area = Height * Width
print("Height = %.2f"%(Height))
print("Width = %.2f"%(Width))
print("Perimeter = %.2f"%(Perimeter))
print("Area = %.2f"%(Area))
```
## **106:公里英哩換算**
- 陷阱:題目是說「平均時速」而不是「英里」
- 時速公式:距離 / 時間
```python
x = float(input())
y = float(input())
z = float(input())
time = (x + y / 60) / 60
speed = z / 1.6 / time
print("Speed = %.1f"%(speed))
```
## **107:數值計算**
```python
num1 = eval(input())
num2 = eval(input())
num3 = eval(input())
num4 = eval(input())
num5 = eval(input())
summ = num1+num2+num3+num4+num5
avg = summ/5
print(num1,num2,num3,num4,num5)
print('Sum = %.1f'%summ)
print('Average = %.1f'%avg)
```
## **108:座標距離計算**
- 陷阱:輸出時空格
```python
x1 = eval(input())
y1 = eval(input())
x2 = eval(input())
y2 = eval(input())
print("(",x1,",",y1,")")
print("(",x2,",",y2,")")
print('Distance = %.4f'%((x1-x2)**2+(y1-y2)**2)**0.5)
```
## **109:正五邊形面積計算**
請撰寫一程式,讓使用者輸入一個正數s,代表正五邊形之邊長,計算並輸出此正五邊形之面積(Area)。
提示1:建議使用import math模組的math.pow及math.tan
提示2:正五邊形面積的公式: $ Area=(5 * s^2)/(4 * tan(pi/5))$
提示3:輸出浮點數到小數點後第四位。
```python
import math
s = int(input())
Area = (5 * math.pow(s,2) ) / ( 4*math.tan(math.pi/5) )
print("Area = %.4f"%(Area))
```
## **110:正n邊形面積計算**
```python
import math
n = eval(input())
s = eval(input())
area = (n*pow(s,2))/(4*math.tan(math.pi/n))
print('Area = %.4f'%area)
```
# Python 第2類:選擇敘述
## **201:偶數判斷**
請使用選擇敘述撰寫一程式,讓使用者輸入一個正整數,然後判斷它是否為偶數(even)。
```python
n = eval(input())
if n % 2 == 0:
print("%d is an even number."%(n))
else:
print("%d is not an even number."%(n))
```
## **202:倍數判斷**
請使用選擇敘述撰寫一程式,讓使用者輸入一個正整數,然後判斷它是3或5的倍數,顯示【x is a multiple of 3.】或【x is a multiple of 5.】;若此數值同時為3與5的倍數,顯示【x is a multiple of 3 and 5.】;如此數值皆不屬於3或5的倍數,顯示【x is not a multiple of 3 or 5.】,將使用者輸入的數值代入x。
- 難達成的條件先寫
```python
num = int(input())
if num % 3 == 0 and num%5 == 0:
print("%d is a multiple of 3 and 5."%(num))
elif num % 3 == 0:
print("%d is a multiple of 3."%(num))
elif num % 5 == 0:
print("%d is a multiple of 5."%(num))
else:
print("%d is not a multiple of 3 or 5."%(num))
```
## **203:閏年判斷**
請使用選擇敘述撰寫一程式,讓使用者輸入一個西元年份,然後判斷它是否為閏年(leap year)或平年。其判斷規則為:每四年一閏,每百年不閏,但每四百年也一閏。
- 先判斷400,因為會與百年不閏衝突
```python
year = eval(input())
if year%400 == 0 :
print('%d is a leap year.'%(year))
elif year%100 == 0:
print('%d is not a leap year.'%(year))
elif year%4==0:
print('%d is a leap year.'%(year))
else:
print('%d is not a leap year.'%(year))
```
## **204:算術運算**
請使用選擇敘述撰寫一程式,讓使用者輸入兩個整數a、b,然後再輸入一算術運算子 (+、-、*、/、//、%) ,輸出經過運算後的結果。
```python
a = int(input())
b = int(input())
operator = input()
if operator == '+':
result = a + b
elif operator == '-':
result = a - b
elif operator == '*':
result = a * b
elif operator == '/':
result = a / b
elif operator == '%':
result = a % b
print(result)
```
## **205:字元判斷**
使用選擇敘述撰寫一程式,讓使用者輸入一個字元,判斷它是包括大、小寫的英文字母(alphabet)、數字(number)、或者其它字元(symbol)。例如:a為英文字母、9為數字、$為其它字元。
- %c 字元格式
```python
char = input()
if char.isalpha():
print("%c is an alphabet."%(char))
elif char.isdigit():
print("%c is a number."%(char))
else:
print("%c is a symbol."%(char))
```
## **206:等級判斷**
請使用選擇敘述撰寫一程式,根據使用者輸入的分數顯示對應的等級。標準如下表所示:
留言
建議修訂
分 數 等級
80 ~ 100 A
70 ~ 79 B
60 ~ 69 C
<= 59 F
```python
n=int(input())
if(80<= n<=100) : print('A')
elif(70 <= n<80) : print('B')
elif(60<= n<70) : print('C')
else : print('F')
```
## **207:折扣方案**
請使用選擇敘述撰寫一程式,要求使用者輸入購物金額,購物金額需大於8,000(含)以上,並顯示折扣優惠後的實付金額。購物金額折扣方案如下表所示:
金 額 折 扣
8,000(含)以上 9.5折
18,000(含)以上 9折
28,000(含)以上 8折
38,000(含)以上 7折
```python
money = int(input())
result = 0
if money >= 38000:
result = money * 0.7
elif money >= 28000:
result = money * 0.8
elif money >= 18000:
result = money * 0.9
elif money >- 8000:
result = money * 0.95
print(result)
```
## **208:十進位換算**
請使用選擇敘述撰寫一程式,讓使用者輸入一個十進位整數num(0 ≤ num ≤ 15),將num轉換成十六進位值。
提示:轉換規則 = 十進位09的十六進位值為其本身,十進位1015的十六進位值為A~F。
```python
n=eval(input())
if(n>=0 and n<10) : print(n)
elif (n==10) : print('A')
elif (n==11) : print('B')
elif (n==12) : print('C')
elif (n==13) : print('D')
elif (n==14) : print('E')
elif (n==15) : print('F')
```
## **209:距離判斷**
請使用選擇敘述撰寫一程式,讓使用者輸入一個點的平面座標x和y值,判斷此點是否與點(5, 6)的距離小於或等於15,如距離小於或等於15顯示【Inside】,反之顯示【Outside】。
```python
import math
a = 5
b = 6
x = int(input())
y = int(input())
pos = math.pow(math.pow((x - a), 2) + math.pow((y - b), 2), 0.5)
if pos > 15:
print("Outside")
else:
print("Inside")
```
## **210:三角形判斷**
請使用選擇敘述撰寫一程式,讓使用者輸入三個邊長,檢查這三個邊長是否可以組成一個三角形。若可以,則輸出該三角形之周長;否則顯示【Invalid】。
- 檢查方法 = 任意兩個邊長之總和大於第三邊長
```python
x = eval(input())
y = eval(input())
z = eval(input())
if x+y > z and x+z > y and y+z > x:
print(x+y+z)
else:
print('Invalid')
```
# Python 第3類:迴圈敘述
## **301:迴圈整數連加**
請使用迴圈敘述撰寫一程式,讓使用者輸入兩個正整數a、b(a < b),利用迴圈計算從a開始連加到b的總和。例如:輸入a=1、b=100,則輸出結果為5050(1 + 2 + … + 100 = 5050)。
```python
a=int(input())
b=int(input())
sum=0
for i in range (a,b+1):
sum+=i
print(sum)
```
## **302:迴圈偶數連加**
請使用迴圈敘述撰寫一程式,讓使用者輸入兩個正整數a、b(a < b),利用迴圈計算從a開始的偶數連加到b的總和。例如:輸入a=1、b=100,則輸出結果為2550(2 + 4 + … + 100 = 2550)。
```python
a=int(input())
b=int(input())
sum=0
for i in range (a,b+1):
if(i%2==0):
sum+=i
print(sum)
```
## **303:迴圈數值相乘**
請使用迴圈敘述撰寫一程式,讓使用者輸入兩個正整數a、b(a < b),利用迴圈計算從a開始的偶數連加到b的總和。例如:輸入a=1、b=100,則輸出結果為2550(2 + 4 + … + 100 = 2550)。
```python
a=eval(input())
c=0
for i in range(1,a+1):
for j in range(1,i+1):
c=i*j
print("%4d"%(c),end='')
print() #換行
```
## **304:迴圈倍數總和**
請使用迴圈敘述撰寫一程式,讓使用者輸入一個正整數a,利用迴圈計算從1到a之間,所有5之倍數數字總和。
```python
n=eval(input())
sum=0
for i in range(1,n+1):
if(i%5==0):
sum+=i
print(sum)
```
## **305:數字反轉**
請撰寫一程式,讓使用者輸入一個正整數,將此數值以反轉的順序輸出。
解法1
```python
a=int(input())
if(a==0):
print(0)
while (a!=0) :
print(int(a%10),end="")
a=a//10
```
解法2
切片[起始值:終止值:增加值],跟range()一樣,只到終止值-1,“如果增加值為-1”,則會往前移動
```python
text = input()
print(text[::-1])
```
## **306:迴圈階乘計算**
請使用迴圈敘述撰寫一程式,讓使用者輸入一個正整數n,利用迴圈計算並輸出n!的值。
- n!=1*2*3..*n (階層)
```python
n=eval(input())
sum=1
for i in range(1,n+1):
sum*=i
print(sum)
```
## **307:乘法表**
(1) 請使用迴圈敘述撰寫一程式,要求使用者輸入一個正整數n(n<10),顯示n*n乘法表。
(2) 每項運算式需進行格式化排列整齊,每個運算子及運算元輸出的欄寬為2,而每項乘積輸出的欄寬為4,皆靠左對齊不跳行。
- 考試請注意“乘數與被乘數位置”
```python
num = eval(input())
for i in range(1, num+1):
for j in range(1, num+1):
print("%-2d* %-2d= %-4d"%(j, i, i*j), end="")
print()
```
## **308:迴圈位數加總**
請使用迴圈敘述撰寫一程式,要求使用者輸入一個數字,此數字代表後面測試資料的數量。每一筆測試資料是一個正整數(由使用者輸入),將此正整數的每位數全部加總起來。
```python
a = int(input()) # 測資筆數
for i in range(a):
ans = 0
n = int(input()) # 輸入數字(改成 int,方便數字處理)
temp = n
while temp > 0:
ans += temp % 10 # 取出最後一位數字
temp //= 10 # 去掉最後一位
print("Sum of all digits of " + str(n) + " is " + str(ans))
```
## **309:存款總額**
請使用迴圈敘述撰寫一程式,提示使用者輸入金額(如10,000)、年收益率(如5.75),以及經過的月份數(如5),接著顯示每個月的存款總額。
- 四捨五入,輸出浮點數到小數點後第二位。
```python
total = eval(input())
y = eval(input())
m = eval(input())
print('%s \t %s' % ('Month', 'Amount'))
for i in range(1, m + 1):
total += total * y / 1200
print('%3d \t %.2f' % (i, total))
```
## **310:迴圈公式計算**
請使用迴圈敘述撰寫一程式,讓使用者輸入正整數n (1 < n),計算以下公式的總和並顯示結果:

### for 迴圈解法
```python
# 讀取使用者輸入的數字並轉換為整數
x = eval(input())
# 初始化累加結果
tmp = 0
# 使用 for 迴圈計算累加和
for i in range(1, x):
# 計算當前項目並累加到 tmp
tmp += 1 / ((i ** 0.5) + ((i + 1) ** 0.5))
# 以四捨五入到小數點後四位的格式輸出結果
print('%.4f' % (tmp))
```
### while 迴圈解法
```python
# 讀取使用者輸入的數字並轉換為整數
x = eval(input())
# 初始化變數
i = 1 # 起始數值
tmp = 0 # 累加結果
# 使用 while 迴圈計算累加和,直到 i 等於 x
while i < x:
# 累加到 tmp
tmp += 1 / ((i ** 0.5) + ((i + 1) ** 0.5))
# 將 i 增加 1,進入下一圈迴圈
i += 1
# 以四捨五入到小數點後四位的格式輸出結果
print('%.4f' % (tmp))
```
# Python 第4類:進階控制流程
## **401:最小值**
請撰寫一程式,由使用者輸入十個數字,然後找出其最小值,最後輸出最小值。
```python
num = []
for i in range(10):
num.append(eval(input()))
print(min(num))
```
## **402:不定迴圈**
請撰寫一程式,讓使用者輸入數字,輸入的動作直到輸入值為9999才結束,然後找出其最小值,並輸出最小值。
```python
n= []
while True:
value = eval(input())
if value == 9999:
break
n.append(value)
print(min(n))
```
## **403:倍數總和計算**
請撰寫一程式,讓使用者輸入兩個正整數a、b(a<=b),輸出從a到b(包含a和b)之間4或9的倍數(一列輸出十個數字、欄寬為4、靠左對齊)以及倍數之個數、總和。
- \n:換段落
```python
myList = []
temp = 0 # 計算一行輸出了多少
a = eval(input())
b = eval(input())
for i in range(a, b+1):
if i % 4 == 0 or i % 9 == 0:
temp += 1
myList.append(i)
print("%-4d"%(i), end = "") # 先印在換行
if temp % 10 == 0:
print()
print("\n%d"%len(myList)) # 換行
print("%d"%(sum(myList)))
```
## **404:數字反轉判斷**
請撰寫一程式,讓使用者輸入一個正整數,將此正整數以反轉的順序輸出,並判斷如輸入0,則輸出為0。
- 數值解法
```python
n=eval(input())
if n ==0:
print(0)
else:
for i in range(0,len(str(n))):
print(n%10,end="")
n=n//10
print()
```
- 字串解法
```python
n=str(input())
s=''.join(reversed(n))
print(s)
```
## **405:不定數迴圈-分數等級**
請撰寫一程式,以不定數迴圈的方式輸入一個正整數(代表分數),之後根據以下分數與GPA的對照表,印出其所對應的GPA。假設此不定數迴圈輸入-9999則會結束此迴圈。標準如下表所示:
分 數 GPA
90 ~ 100 A
80 ~ 89 B
70 ~ 79 C
60 ~ 69 D
0 ~ 59 E
```python
num = eval(input()) # 一開始輸入
while num != -9999:
if num >= 90:
print("A")
elif num >= 80:
print("B")
elif num >= 70:
print("C")
elif num >= 60:
print("D")
else:
print("E")
num = eval(input()) # 判斷完,再繼續輸入num
```
## **406:不定數迴圈-BMI計算**
請撰寫一程式,以不定數迴圈的方式輸入身高與體重,計算出BMI之後再根據以下對照表,印出BMI及相對應的BMI代表意義(State)。假設此不定數迴圈輸入-9999則會結束此迴圈。標準如下表所示:
BMI值 代表意義
BMI < 18.5 under weight
18.5 <= BMI < 25 normal
25.0 <= BMI < 30 over weight
30 <= BMI fat
```python
while True:
H = float(input())
if H == -9999: break
else:
W = float(input())
BMI = W / (H/100)**2
print('BMI: %.2f'%(BMI))
if BMI < 18.5: print("State: under weight")
if 18.5 <= BMI < 25: print("State: normal")
if 25.0 <= BMI < 30: print("State: over weight")
if 30 <= BMI: print("State: fat")
```
## **407:不定數迴圈-閏年判斷**
(1) 請撰寫一程式,以不定數迴圈的方式讓使用者輸入西元年份,然後判斷它是否為閏年(leap year)或平年。其判斷規則如下:每四年一閏,每百年不閏,但每四百年也一閏。
(2) 假設此不定數迴圈輸入-9999則會結束此迴圈。
```python
year = eval(input())
while year!=-9999:
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print('%d is a leap year.'%year)
else :
print('%d is not a leap year.'%year)
year = eval(input())
```
## **408:奇偶數個數計算**
請撰寫一程式,讓使用者輸入十個整數,計算並輸出偶數和奇數的個數。
```python
even = odd = 0
for i in range(10):
number = int(input())
if number % 2 == 0:
even += 1
else:
odd += 1
print("Even numbers: %d"%even)
print("Odd numbers: %d"%odd)
```
## **409:得票數計算**
某次選舉有兩位候選人,分別是No.1: Nami、No.2: Chopper。請撰寫一程式,輸入五張選票,輸入值如為1即表示針對1號候選人投票;輸入值如為2即表示針對2號候選人投票,如輸入其他值則視為廢票。每次投完後需印出目前每位候選人的得票數,最後印出最高票者為當選人;如最終計算有相同的最高票數者或無法選出最高票者,顯示【=> No one won the election.】。
```python
count1 = 0
count2 = 0
null = 0
for i in range(5):
vote = int(input())
if vote == 1:
count1 += 1
elif vote == 2:
count2 += 1
else:
null += 1
print("Total votes of No.1: Nami = %d" % count1)
print("Total votes of No.2: Chopper = %d" % count2)
print("Total null votes = %d" % (null))
if count1 > count2:
print("=> No.1 Nami won the election.")
elif count1 < count2:
print("=> No.2 Chopper won the election.")
else:
print("=> No one won the election.")
```
## **410:繪製等腰三角形**
請撰寫一程式,依照使用者輸入的n,畫出對應的等腰三角形。

### 解法(1
```python
num = int(input())
for i in range(num, 0, -1):
print(' ' * (i - 1) + '*' * (1 + 2 * (num - i)))
```
### 解法(2
``` python
num = int(input())
for i in range(1, num + 1):
print(" " * (num - i), end="")
print("*" * (2 * i - 1))
```
# Python 第5類:函式(Function)
## **501:訊息顯示**
請撰寫一程式,呼叫函式compute(),該函式功能為讓使用者輸入系別(Department)、學號(Student ID)和姓名(Name)並顯示這些訊息。
```python
def compute():
department = input()
studentid = input()
name = input()
print('Department:',department)
print('Student ID:',studentid)
print('Name:',name)
compute()
```
## **502:乘積**
請撰寫一程式,將使用者輸入的兩個整數作為參數傳遞給一個名為compute(x, y)的函式,此函式將回傳x和y的乘積。
解法(1
```python
def compute(x,y):
return x*y
x = eval(input())
y = eval(input())
print(compute(x,y))
```
解法(2
```python
def compute():
x=eval(input())
y=eval(input())
print(x*y)
compute()
```
## **503:連加計算**
請撰寫一程式,讓使用者輸入兩個整數,接著呼叫函式compute(),此函式接收兩個參數a、b,並回傳從a連加到b的和。
```python
def compute(a,b):
ans=0
for i in range(a,b+1):
ans+=i
return ans
x = eval(input())
y = eval(input())
print(compute(x,y))
```
## **504:次方計算**

```python
def compute():
x=eval(input())
y=eval(input())
print(x**y)
compute()
```
## **505:依參數格式化輸出**
請撰寫一程式,將使用者輸入的三個參數,變數名稱分別為a(代表字元character)、x(代表個數)、y(代表列數),作為參數傳遞給一個名為compute()的函式,該函式功能為:一列印出x個a字元,總共印出y列。
留言
建議修訂
- 輸出的每一個字元後方有一空格。
```python
def compute(a,x,y):
for i in range(y):
for j in range(x):
print('%c '%a,end='')
print()
a = input()
x = eval(input())
y = eval(input())
compute(a,x,y)
```
## **506:一元二次方程式**

- 輸出有順序性,回傳方程式的解,無須考慮小數點位數
- 判別式 提醒一下ㄉ 雖然你們會考完 應該比我還熟


```python
def compute(a,b,c):
q=b**2-4*a*c
if q<0:
print("Your equation has no root.")
elif q==0:
print(-b/(2*a))
else:
q1=(-b+q**0.5)/(2*a)
q2=(-b-q**0.5)/(2*a)
print('{}, {}'.format(q1, q2))
a=int(input())
b=int(input())
c=int(input())
compute(a,b,c)
```
## **507:質數**
請撰寫一程式,讓使用者輸入一個整數x,並將x傳遞給名為compute()的函式,此函式將回傳x是否為質數(Prime number)的布林值,接著再將判斷結果輸出。如輸入值為質數顯示【Prime】,否則顯示【Not Prime】。
```python
def compute(x):
# 如果 x 小於等於 1,不是質數
if x <= 1:
return False
# 從 2 到 x-1 檢查是否有其他因數
for i in range(2, x):
# 如果能被 i 整除,則不是質數直接傳回 False
if x % i == 0:
return False
# 如果沒有其他因數,則是質數
return True
# 從這裡輸入要測試的數
x = eval(input())
if compute(x)==True:
print('Prime')
else:
print('Not Prime')
```
## **508:最大公因數**
請撰寫一程式,讓使用者輸入兩個正整數x、y,並將x與y傳遞給名為compute()的函式,此函式回傳x和y的最大公因數。
- 輸入以 “,” 區隔
- 解一
```python
def compute(x,y):
gcd=1
if x>y:
for i in range(1,x+1):
if x%i==0 and y%i==0:
gcd = i
else:
for i in range(1,y+1):
if x%i==0 and y%i==0:
gcd = i
return gcd
x,y=eval(input())
print(compute(x,y))
```
- 直接套入 math 函數解法
- 解二
```python
import math
def compute(x,y):
return math.gcd(x,y)
x,y=eval(input())
print(compute(x,y))
```
## **509:最簡分數**
請撰寫一程式,讓使用者輸入二個分數,分別是x/y和m/n(其中x、y、m、n皆為正整數),計算這兩個分數的和為p/q,接著將p和q傳遞給名為compute()函式,此函式回傳p和q的最大公因數(Greatest Common Divisor, GCD)。再將p和q各除以其最大公因數,最後輸出的結果必須以最簡分數表示
```python
import math
x, y= eval(input())
m, n = eval(input())
# 通分(將兩數分子乘以對方的分母)
p = x * n + m * y
# 通分(分母)
q = y * n
# 找出通分後分子分母的最大公因數
result_gcd = math.gcd(q, p)
# 將分子除以最大公因數
new_p = p/result_gcd
# 將分母除以最大公因數
new_q = q/result_gcd
print("%d/%d + %d/%d = %d/%d"%(x, y, m, n, new_p, new_q))
```
## **510:費氏數列**
請撰寫一程式,計算費氏數列(Fibonacci numbers),使用者輸入一正整數num (num>=2),並將它傳遞給名為compute()的函式,此函式將輸出費氏數列前num個的數值。

解1
```python
def compute(n):
if n > 1:
return compute(n-1) + compute(n-2) # 遞迴
return n
n=int(input())
for i in range(n):
print(compute(i), end = ' ')
```
解2
```python
n = int(input())
a, b = 0, 1
for i in range(n):
print(a, end=' ')
temp = a + b
a = b
b = temp
```