---
# System prepended metadata

title: 第二周 python術科練習

---

# 第二周 python術科練習

會在第三週公布第二周的參考答案

### Step 1: 棄保效應

https://zerojudge.tw/ShowProblem?problemid=d984

內容：
台灣的選舉法令禁止各陣營及媒體在投票日前的一個星期內公佈民調結果，其中最重要的一個因素是要避免「棄保效應」。所謂的「棄保效應」是指選民在得知自己所支持的候選人當選無望時，有可能會把票投給其他比較可能當選的人，以免浪費了自己的一票。假設某選舉有三位候選人來競選一個職位，在「棄保效應」發揮到極致的情形下，所有民調第三名的候選人的支持者都會把票投民調第二名的候選人，也就是他們都會「棄三保二」。給你 A, B, C 三個候選人的支持者人數，請判斷誰會當選？

輸入說明：
輸入有若干筆測試資料，每筆一行。每行有三個以空白隔開的整數 a, b, c 代表候選人 A, B, C 的支持者人數，0 ≤ a, b, c ≤ 2147483647。你可以假設在「棄保效應」之後，不會有相同票數的情形發生。

輸出說明：
請輸出將會當選的人是 A, B 或 C。

範例輸入 #1
3 4 5
1 3 5

範例輸出：#2
B
C

解題絲路：
題目簡單來說 就是將最少那個的票數灌給第二少的，接著最多跟第二少的比票數看哪個比較多，記得最後要EOF結束哦~~


### Step 2: 數字反轉
https://zerojudge.tw/ShowProblem?problemid=a038

內容：輸入任意數字，並將其數字全部倒轉

輸入說明：輸入一行包含一個整數，且不超過 231

輸出說明：輸出翻轉過後的數字

輸入#1：
12345

輸出#1:
54321

輸入#2:
5050

輸出#2:
505

解題絲路：這題不只[::-1]這麼簡單哦！ 5050 反轉下來便0505，輸出要變505，也就是說外面要再包一個int！


### 新語法：
如果要找出兩種list中，相同的部分有哪些，可以使用intersection的語法

舉例：
```python
a=[5,7,8,9,4]
b=[7,94,51,9]
print(a.intersection(b)) #7,9
print(len(a.intersection(b))) #總共有幾個交集 #2
```

### Step 3:共同的數-簡易版
https://zerojudge.tw/ShowProblem?problemid=d478
內容：
因為學長覺得d136太可怕，所以出一題簡單版的XD 

小潘跟小花都有很多個正整數，自己的數不會有重覆出現的，而且都是遞增排列。

現在她們想要知道，兩個人的數有幾個重覆的呢？

輸入說明：
第一行有兩個數字n,m。 (1<=n<=100,1<=m<=10000)

接著共有n筆測資，每筆測資共有兩行，分別代表兩個人擁有的數，每行共有m個數。

所有數字都不大於231-1。

輸出說明：
每筆測資請輸出一個數字，

代表兩個人的數有幾個重覆的。

範例輸入：
2 6
1 5 6 8 9 13
3 4 5 7 8 11
4 6 7 14 16 23
6 9 12 13 16 23

範例輸出：
2
3

參考程式：
```python
n,m=map(int,input().split())
for i in range(n):
    list1=[int(i) for i in input().split()]
    list2=[int(i) for i in input().split()]
    a=set(list1)  #將重複的移除
    b=set(list2)  #將重複的移除
    print(len(a.intersection(b)))  #印出有幾個交集
```

### Step 4:水仙花數

請撰寫一程式判斷，輸入一個3位數的整數，若他的所有位數的3次方恰好等於自己。
如：$$
153=1^3+5^3+3^3
$$

請判斷是否符合以上規則

輸入：153
輸出：yes

輸入：154
輸出：no

程式碼：

寄到gmail~

解題絲路：
這種解法的方式有很多，而其中一種，可以將它已str的方式進入list，以下程式：
```python=1
a=list(input())  #a=["1","5","3"]
```
之後以迴圈方式進行加總後判斷

```python=1
a=list(input())  #a=["1","5","3"]
s=0
for i in range(3):
    s+=int(a[i])**3
if s==a:
    print("yes")
else:
    print("no")
```


請撰寫一程式判斷，輸入一個3位數的整數，若他的所有位數的3次方恰好等於自己。
如：$$
153=1^3+5^3+3^3
$$

請判斷是否符合以上規則

輸入：
100 999
輸出：
153 370 371 407

輸入：
500 900
輸出：no

這個與上一題差不多，稍微修改一下用迴圈去跑這之間的數字

程式寄到gmail~


### a040:阿姆斯壯數
https://zerojudge.tw/ShowProblem?problemid=a040

內容
所謂 Armstrong number 指的是一個 n 位數的整數，它的所有位數的 n 次方和恰好等於自己。

如；$$
1634=1^4+6^4+3^4+4^4
$$
請依題目需求在一定範圍內找出該範圍內的所有 armstrong numbers.

範例輸入：
100 999

範例輸出：
153 370 371 407

範例輸入：
10 99

範例輸出
none

解題絲路：
若有3位數則三次方，若有四位數則四次方，利用前面的去須改一下~~

參考解法：

```python
a,b=map(int,input().split())
list1=[]
for i in range(a,b+1):
    c=list(str(i))
    h=0
    for j in range(len(c)):
        h+=int(c[j])**len(c)
    if h==i:
        print(i,end=" ")
        list1.append(i)
if len(list1)==0:
    print("none")
```


### Step 5:蝸牛老師的點名單-續
https://zerojudge.tw/ShowProblem?problemid=c929

內容：
繼第一堂課之後同學們因為太無聊了，開始在他們的名字之間空格改成各種不同的字串，例如" and "(不含引號)，假設有兩位同學名字分別是"apple"及"banana"則他們會把點名單寫成"apple and banana"(不含引號)，蝸牛老師很頭痛，希望你幫他寫一個程式把大家的名字分成一行一行的。

輸入說明：
第一行為一個字串s代表大家名字中間的字串，第二行為蝸牛老師拿到的點名單。(字元範圍為ASCII 32~126) 字串長度皆小於1000

輸出說明：
請將同學們名字分成一行一行輸出。

輸入:
範例一:
and
appleandbanana

範例二
 ,
baluteshih ,leo , alan

輸出:
範例一:
apple
banana

範例二:
baluteshih
leo
 alan
 
在python中split()是分割的意思，分割以空白隔開，如果要以逗號隔開，則會使用split(",")

### Step 5:  f070: 1. 韓信點兵 (HanXin)

https://zerojudge.tw/ShowProblem?problemid=f070

解題絲乳：
```python
while not(w%a==b and w%c==d and w%e==f)
```


### Step 6:  The Strongest Chain
https://zerojudge.tw/ShowProblem?problemid=f063

內容：
英文有一句諺語: "A chain is only as strong as its weakest link." (一條鐵鍊的強度相當於其中最弱的一環。) 用來說明一個團隊中的最弱的一個人足以拖垮整個團隊的表現，也就是俗稱的「豬隊友」。

給你若干條鐵鍊中每條鐵鍊的每個環節的強度，請找出最強的鍊條。

輸入說明：
輸入的第一行含有一個整數 n，代表鐵鍊的數量。接下來有 n 行，每行代表一條鐵鍊，第一個整數 k 代表這條鍊條有幾個環節，其後有 k 個整數代表每個環節的強度。

輸出說明：
輸出最大的鍊條強度。

範例輸入：
2
3 15 17 19
4 43 37 28 11

範例輸出：
15

範例輸入:
4
4 10 11 8 9
5 15 12 18 7 20
3 16 20 22
3 123 23 3

範例輸出：
16

解題絲乳：
題意說明：找出每條鍊子的最小值，輸入1 來說 15,17,19的最小值是15，43,37,28,11的最小值是11，在單獨拿出15跟11挑出最大值

**程式部分**參考：
```python
list1=[]
n=int(input())
for i in range(n):
    list2=[int(i) for i in input().split()]
    list1.append(list2[1:])
```

### Step 7:  e357: 遞迴函數練習
https://zerojudge.tw/ShowProblem?problemid=e357

內容：
定義一個函數F(x)，

若x = 1, 則 F(x) = 1
若x 為偶數，則 F(x) = F(x/2)

其餘狀況，F(x) = F(x - 1) + F(x + 1)

輸入說明：
輸入只有一行，其中包含一個正整數x (1 <= x <= 2000000)。

輸出說明：
輸出只有一行，其中包含一個正整數F(x)。

輸入：
6
輸出:
2

解題絲路：
宣告def f(x): 後， 依題意寫出，如果為1就傳1就if x==1 return 1，以此類推