#26919: [Python]最大公倍數lcm + combinations


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
d444. 排容原理 | From: [1.172.241.233] | 發表日期 : 2021-09-01 23:09

Python math套件有gcd,

gcd在Python 3.9支援多個數字一次gcd,例如gcd(6, 12, 30) = 6

lcm也是在Python 3.9新增的功能

因此現在只有一次能夠輸入兩個參數的gcd

 

if sys.version_info >= (39):
    def gcd(*integersint) -> int: ...
else:
    def gcd(__xint__yint) -> int: ...
 
if sys.version_info >= (39):
    def lcm(*integersint) -> int: ...

 

如果哪天系統升級Python版本的話,就可以直接用了

既然現在不能用的話,就自己做一個吧!

def _lcm(a,b):
    return a*b//gcd(a,b)
lcm = lambda seqreduce(_lcmseq)
 

 

這裡用到特別的東西叫做functools.reduce,可以快速的把 sequence 內的元素兩兩做運算後,輸出結果

達成像 gcd(gcd(6,12), 30) 的效果

於是,多重參數的lcm就這樣達成拉,讚!

_lcm,在Python的命名中,在變數前使用單一底線,代表「內部使用」,但並沒有太多的效果,就是讓別人不太容易誤用而已

(詳細可以看https://docs.python.org/zh-tw/3/reference/lexical_analysis.html#reserved-classes-of-identifiers)

lambda的效果與def的效果一樣,只是可以化簡成一行達成囉~

____________________________

這題用到combination大概會有類似下面這種狀況呦

combination([1,2,3,4], 2) -> 12 13 14 23 34

combination([1,2,3,4], 3) -> 123 234

combination([1,2,3,4], 4) -> 1234

 

==>

# 一個的話,直接輸出seq就可以了,所以range(從2開始)

for k in range(2, len(seq)):

  combination(seq, k)

 
#26920: Re:[Python]最大公倍數lcm + combinations


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
d444. 排容原理 | From: [1.172.241.233] | 發表日期 : 2021-09-01 23:13

 

 

更正:

這題用到combination大概會有類似下面這種狀況呦

combination([1,2,3,4], 2) -> 12 13 14 23  24 34

combination([1,2,3,4], 3) -> 123 124 234

combination([1,2,3,4], 4) -> 1234

 

==>

# 一個的話,直接輸出seq就可以了,所以range(從2開始, 長度記得要包含所以+1)

for k in range(2, len(seq)+1):

  combination(seq, k)



 
ZeroJudge Forum