# 虎科大資管盃初賽錯題
## 數字輸出對齊
### **題目**
任意輸入2個數字後,首先在同一行分別輸出長度為10且靠右對齊,
然後再下一行一樣輸出長度為10但靠左對齊。
注意,請在數字輸出前先輸出一個12345678901234567890的尺規數字。
### 程式碼
```python
a = int(input())
b = int(input())
str1 = f'{a:>10} {b:>10}'
str2 = f'{a:<10} {b:<10}'
print(12345678901234567890)
print(str1)
print(str2)
```
### 解題
使用 f-string 格式化 a 和 b:
```python
a = 123
print(f'{a:>10}') #向右(>向右、<向左)對齊,並用空白填充
#輸出:.......123
```
### 延伸
如果在 : 和 > 中間加入 % :
```python
a = 123
print(f'{a:%>5}')
#輸出:%%123
```
如果把5改成10:
```python
a = 123
print(f'{a:%>10}')
#輸出:%%%%%%%123
```
我在網路上還找到了一些格式化輸出:
```python
左對齊,填充%
str_left = str(a).ljust(5, '%')
print(str_left) # 輸出:123%%
# 右對齊,填充%
str_right = str(a).rjust(5, '%')
print(str_right) # 輸出:%%123
# 置中對齊,填充%
str_center = str(a).center(5, '%')
print(str_center) # 輸出:%123%
```
**以ljust為例,ljust(總長度,填充字符)**
___
## 字串類型判斷
### **題目**
任意輸入一字串, 然後判斷是否為大寫? 是否為小寫? 是否為字母? 是否為數字?
### 程式碼
```python
s = input("請輸入一個字串: ")
is_upper = s.isupper()
is_lower = s.islower()
is_alpha = s.isalpha()
is_digit = s.isdigit()
print(f"大寫: {is_upper}")
print(f"小寫: {is_lower}")
print(f"字母: {is_alpha}")
print(f"數字: {is_digit}")
```
### 解題
使用python中字串類型檢測:
```python
s = input("請輸入一個字串: ")
is_upper = s.isupper()#判斷是否為大寫,回傳True或False
is_lower = s.islower()#判斷是否為小寫,回傳True或False
is_alpha = s.isalpha()#判斷是否為字母,回傳True或False
is_digit = s.isdigit()#判斷是否為數字,回傳True或False
```
### 延伸
我還查到了一些字串的屬性應用:
```python
input_str = input()
print(input_str)
upper_str = input_str.upper()
print(upper_str)#輸出大寫字串
lower_str = input_str.lower()
print(lower_str)#輸出小寫字串
```
還可以結合filter函數:
```python
s = "123helloWORLD"
# 過濾出大寫字母
upper_chars = filter(str.isupper, s)
upper_str = ''.join(upper_chars)
print(upper_str)
# 過濾出小寫字母
lower_chars = filter(str.islower, s)
lower_str = ''.join(lower_chars)
print(lower_str)
```
**filter(函數,可迭代對象)**
---
## 找出眾數
### **題目**
請撰寫一程式,讓使用者持續輸入整數作為樣本數直到-1為止,然後輸出眾數(樣本中出現最多次的數字)。注意:樣本中可能不只有一個眾數,最後輸出請依據數字由小到大,且不用換行。
### 程式碼
```python
list1 = []
while True:
a = int(input())
if a == -1:
break
else:
list1.append(a)
dic = {}
for i in list1:
if i in dic:
dic[i] += 1
else:
dic[i] = 1
maximum = max(dic.values())
numbers = [num for num, count in dic.items() if count == maximum]
print(*numbers)
```
### 解題
利用字典建立每個數字出現次數:
```python
dic = {}
for i in list1:
if i in dic:
dic[i] += 1
else:
dic[i] = 1
#如果輸入:1,1,2,3,3,4,5
#dic = {1:2,2:1,3:2,4:1,5:1}
```
再找出所有出現次數最多的數字(不一定只有一個)建立在串列中:
```python
maximum = max(dic.values())
#因為maximum = 2
numbers = [num for num, count in dic.items() if count == maximum]
#numbers = [1,3]
```
### 延伸
如果是要找出現最少次的:
```python
minimum = min(dic.values())
#因為minimum = 1
min_numbers = [num for num,count in dic.items()if count == minimum]
#min_numbers = [2,4,5]
```
輸出字典的額外使用
```python
dic = {'a': 1, 'b': 2, 'c': 3}
# 遍歷鍵值對
print("遍歷鍵值對:")
for key, value in dic.items():
print(key, value) # 輸出: 'a 1', 'b 2', 'c 3'
# 遍歷鍵
print("遍歷鍵:")
for key in dic.keys():
print(key) # 輸出: 'a', 'b', 'c'
# 遍歷值
print("遍歷值:")
for value in dic.values():
print(value) # 輸出: '1', '2', '3'
```
---
## 找出前n項質數
### **題目**
印出前n個質數,若超過十個需換行,每一列印出十個質數。
### 程式碼
```python
n = int(input("請輸入一個正整數 n:"))
s = 2
list1 = []
while n != 0:
count = 0
for j in range(1, s + 1):
if s % j == 0:
count += 1
if count == 2:
list1.append(s)
n -= 1
s += 1
for i in range(0, len(list1), 10):
line = ' '.join(f"{num:>3}" for num in list1[i:i+10])
if i + 10 < len(list1):
print(line)
else:
print(line, end="")
```
### 解題
找出前n項質數:
```python
while n != 0:
count = 0
for j in range(1, s + 1):
if s % j == 0:
count += 1
if count == 2:
list1.append(s)
n -= 1
s += 1
#如果n = 10
#list1 = [2,3,5,7,11,13,17,19,23,29]
```
輸出質數(每10個一行):
```python
for i in range(0, len(list1), 10):
line = ' '.join(f"{num:>3}" for num in list1[i:i+10])
if i + 10 < len(list1):
print(line)
else:
print(line, end="")
#如果n=13
#輸出:
# 2 3 5 7 11 13 17 19 23 29
# 31 37 41
```
### 延伸
如果要改成5個一行:
```python
for i in range(0, len(list1), 5):
line = ' '.join(f"{num:>3}" for num in list1[i:i+5])
if i + 5 < len(list1):
print(line)
else:
print(line, end="")
```
---
## 質因數分解
### **題目**
印出前n個質數,若超過十個需換行,每一列印出十個質數。
### 程式碼
```python
def prime_factors(n):
divisor = 2
factors = []
while n >= divisor * divisor:
if n % divisor == 0:
factors.append(divisor)
n //= divisor
else:
divisor += 1
if n > 1:
factors.append(n)
return factors
n = int(input("請輸入一個正整數:"))
factors = prime_factors(n)
if len(factors) == 1 and factors[0] == n:
print("-1")
else:
print(" * ".join(map(str, factors)))
```
### 解法
找n的因數並儲存在factors中:
```python
def prime_factors(n):
divisor = 2
factors = []
while n >= divisor * divisor:
if n % divisor == 0:
factors.append(divisor)
n //= divisor
else:
divisor += 1
if n > 1:
factors.append(n)
return factors
#如果n=6
#factors = [2,3]
```
輸出:
```python
if len(factors) == 1 and factors[0] == n:
print("-1") # n 是質數
else:
print(" * ".join(map(str, factors)))
#輸出所有因數中間用*隔開
```
---
## 氣泡排序
### **題目**
氣泡排序又稱為泡沫排序(Bubble Sort),是一種簡單的排序演算法,重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
### 程式碼
```python
a = input()
a = a.replace("[", "").replace("]", "").replace(" ", "")
ls = a.split(",")
for i in range(len(ls)):
ls[i] = int(ls[i])
for i in range(len(ls) - 1):
for j in range(len(ls) - 1 - i):
if ls[j] > ls[j + 1]:
ls[j], ls[j + 1] = ls[j + 1], ls[j]
print(f"第{i+1}次 {ls}")
print("排序結果:")
for i in ls:
print(i)
```
### 解題
先把輸入的資料變成正確的list型態:
```python
a = input()
a = a.replace("[", "").replace("]", "").replace(" ", "")
ls = a.split(",")
for i in range(len(ls)):
ls[i] = int(ls[i])
```
反覆地遍歷要排序的列表,一次比較相鄰的兩個元素,如果順序錯誤就交換它們:
```python
for i in range(len(ls) - 1):
for j in range(len(ls) - 1 - i):
if ls[j] > ls[j + 1]:
ls[j], ls[j + 1] = ls[j + 1], ls[j]
print(f"第{i+1}次 {ls}")
```
### 延伸
其他的排序:
1.selection sort
```python
#selection sort
data=[4,5,2,3,7,9,1]
for i in range(10):
data.append(random.randint(0,10))
print(f"original data : {data}")
for i in range(len(data)):
min_idx=i
for j in range(i, len(data)):
if data[j]< data[min_idx]:
min_idx=j
data[i], data[min_idx]= data[min_idx], data[i]
print(f"after selection sort : {data}")
#輸出:[1,2,3,4,5,7,9]
```
2.insertion sort
```python
#insertion sort
data=[4,5,2,3,7,9,1]
for i in range(10):
data.append(random.randint(0,10))
print(f"original data : {data}")
for i in range(1,len(data)):
for j in range(i-1, -1, -1):
if data[i]>data[j]:
x=data.pop(i)
data.insert(j+1,x)
break
if j==0:
x=data.pop(i)
data.insert(0,x)
print(f"after insert sort : {data}")
#輸出:[1,2,3,4,5,7,9]
```
3.quick sort
```python
#quick sort
data=[4,5,2,3,7,9,1]
for i in range(10):
data.append(random.randint(0,10))
print(f"original data : {data}")
def QuickSort(in_list):
if len(in_list)<=1:
return in_list
pivot=in_list[0]
R=[]
L=[]
for No in in_list[1:]:
if No < pivot:
L.append(No)
elif No >= pivot:
R.append(No)
return QuickSort(L)+[pivot]+QuickSort(R)
print(f"after quick sort : {QuickSort(data)}")
#輸出:[1,2,3,4,5,7,9]
```