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