---
# System prepended metadata

title: ＃虎科大程式競賽－

---

# 虎科大資管盃初賽錯題
## 數字輸出對齊
### **題目**
任意輸入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]
```