# 虎科大 資管盃初賽心得&錯題 ## 格式化輸出 ### **題目 #忘記抄題ㄌ:)** 大概是:輸入兩個整數,先輸出一個叫 *12345678901234567890* 的尺標,再把兩字串分別靠左和靠右輸出。 ### 程式碼 ```python a = int(input()) b = int(input()) str2 = ('{:·<10}'.format(a))+('{:·<10}'.format(b)) str1 = ('{:·>10}'.format(a))+('{:·>10}'.format(b)) print(12345678901234567890) print(str1) print(str2) ``` ### 解法 利用''.format()指令,將字串向左和向右對齊。 格式: ```python "{:>10}".format(123) >>將123在長為10的空間內向右對齊(>向右、<向左) #輸出 ·······123 ``` 在冒號和大於/小於之間可以加上想要在空格填入的字符,例如: ```python "{:'+'>10}".format(123) #輸出 123+++++++ ``` ### 我學到 **format格式化**輸出的方法 --- ## 進階分式加總 ### 題目 由使用者輸入正整數 n 值 (已知n>2),然後計算下面公式值,注意:總和取到小數點第2位。 提示輸出:1/3+3/5+5/7+...+(n-2)/n ### 程式碼 ```python n = int(input()) ans = 0 for i in range(int(n/2)): ans += (2*i+1)/(2*i+3) print(f'{2*i+1}/{2*i+3}', end='') if(i != int(n/2)-1): print('+', end='') print(f'={ans:.2f}') ``` ### 解法 **法1:利用format格式化進行四捨五入輸出** 若要把123.4567四捨五入到小數後兩位,可以輸入: ```python '{:.2f}'.format(123.4567) #輸出 123.46 ``` 此處的2f是指把小數點後第2位,f是指float *意義同C#中float a = 0.2f* 若要四捨五入至其他位數,例如個位數: ```python '{:.0f}'.format(123.4567) #輸出 123 ``` 下為format四捨五入的參數對照表: | 小數點下2位 | 小數點下一位 | 個位數 | 十位數 | 百位數 | | ----------- | ------------ | ------ | ------ | -------- | | '{:.2f}' | '{:.1f}' | '{:.0f}' | '{:.-1f}' | '{:.-2f}'| 剩下以此類推 **法2:利用round()函式進行四捨五入** round()格式: ```python round(浮點數, 取到的位數) ``` 輸出條件同上: ```python round(123.4567, 2) #輸出 123.46 ``` **!!注意!!** 若未指定要四捨五入到第幾位,則會預設四捨五入到個位數。 ### 我學到 **round()用法、format四捨五入用法** --- ## 等差數列判別 ### 題目 請連續輸入3個整數,然後自動判斷他們是否為等差數列。 ### 程式碼 ```python a = int(input()) b = int(input()) c = int(input()) if a-b == b-c: print(f'{a} {b} {c} 為等差數列') else: print(f'{a} {b} {c} 不為等差數列') ##輸出:2 4 6 為等差數列 ``` ### 解法 題目本身非常簡單,但問題是他的輸出若要用sep=和end=寫會很麻煩且難以閱讀,所以我請教同學得到了這個方法─ f-string f-string格式: ```python print(f'{變量or欲值執行的運算} 隨意想加的字串') ``` ### 我學到 **f-string**輸出格式 --- ## 計算與判斷 ### 題目 輸入兩數a, b,若兩數相差超過5,則輸出兩數相乘,且若計算結果大於100則輸出"100+";反之則相廚,解若計算結果有小數,則輸出"有小數"、若相等則輸出兩數相加乘根號7,取小數第二位 ### 程式碼 ```python a = int(input()) b = int(input()) if(a == b): print(round((a+b)*(7**0.5), 2)) elif(abs(a-b) > 5): print(a*b, end='') if(a*b > 100): print(',100+', end='') print('') else: if('.' in str(a/b)): print(round(a/b, 16), ',有小數', sep='') else: print(int(a/b)) ``` ### 解法 判斷是否為小數的方法>> **法1: if n%1 != 0** 若整數n除以1的餘數不等於0,即n含有小於1的部分,也就是小數。 **法2: if '.' in str(n)** 把整數n換成字串,判斷n裡是否含有'.',如果有的話,n就是小數。 ### 我學到 **小數的判別法** --- ## 質因數分解 ### 題目 請撰寫一程式,讓使用者輸入一個正整數,輸出該數的質因數分解式子,質因數請由小而大相乘;若為質數,請輸出「-1」。 ### 程式碼 ```python n = int(input()) prime = [] ans = [] a = n t = 0 for i in range(2, n+1): ##質數表 if all(i%j != 0 for j in range(2, i)): prime.append(i) if n in prime: print(-1) else: print(f'{n}=', end='') for k in prime: if a%k == 0: #找到質因數 t += 1 if t != 1: print('*', end='') print(k, end='') a = int(a/k) while a%k == 0: print(f'*{k}', end='') a = int(a/k) print('') ``` ### 解法 首先,我先將從1到n的所有質數找出來,用於後續找各質因數的次數用。 ```python for i in range(2, n+1): ##質數表 if all(i%j != 0 for j in range(2, i)): prime.append(i) 把2到n以i迭代,分別除以2~(i-1)。 因為若i不是j[2~(i-1)]的倍數,則i只有1和i本身這兩個因數,即i是質數。 ``` 再來,我比對質數表,如果n在1~n的質數表內,即n是質數。 ```python if n in prime: print(-1) ``` 若不是質數,則拿質數表內每一個元素去除n。 ```python else: print(f'{n}=', end='') #輸出 6= for k in prime: #迭代質數表的每一個元素 if a%k == 0: #如果n(代換為a計算)可以被某質數k整除,就輸出k >>6=k if t != 1: #又如果這次不是第一個數字 print('*', end='') #則補上一個* a = int(a/k) #更新a的值 while a%k == 0: #繼續運算次數 print(f'*{k}', end='') a = int(a/k) print('') #最後輸出\n以符合格式 ``` ### 我學到 **質數的判斷法** ---