演算法學習(十二)

2022-04-29 09:24:10 字數 3879 閱讀 8772

說明:演算法的基本定理,任何整數都可以表示為乙個或多個素數的乘積,這樣的表示是唯一的,例如:

1000 = 2 * 2 * 2 * 5 * 5 * 5

1001 = 7 * 11 * 13

1002 = 2 * 3 * 167

1003 = 17 * 59

1009 = 1009

問題陳述:

您將得到幾個數字將它們分解為素數的乘積。

輸入資料:第一行中包含分解的整數的數量。

下面的行中包含乙個整數(長度不超過13位)。

答案:應該包含每乙個整數的乘積,表示為p1*p2*p3,p是一些以非降序排列的素數。每個乘積應該用空格分開。

例子:

input data:

51000

1001

1002

1003

1009answer:

2*2*2*5*5*5 7*11*13 2*3*167 17*59 1009

測試資料:

30

1529673724591

2340274453339

702466756897

829817084753

27819311669

186806051203

49953067651

34579886191

4695575168147

2100191285953

3716086062137

2556947487959

542629812761

4073412911317

3009916093333

587577561341

288846512519

68274514267

60010816097

2290843100603

2150048292487

72824930317

2821314585503

23823809797

1186835381663

253181641523

52136986493

5271995870831

1000835638687

654425636171

**如下:

1 test_cases = int(input())  #

測試用例數23

def eladuosai(n): #

厄拉多塞篩法,構造素數

4 l = list(range(1, n+1))

5 l[0] =0

6for i in range(2, n+1):

7if l[i-1] !=0:

8for j in range(i*2, n+1, i):

9 l[j-1] =0

10 result = [x for x in l if x !=0]

11return

result

1213 prime = eladuosai(3000)

1415

for n in

range(test_cases):

16 date =int(input().split()[0])

17 p_list =

18for p in

prime:

19while date % p ==0:

20 date = date /p

2122

if p >date:

23break

24print('

*'.join(str(m) for m in p_list), end='

') #

格式化輸出

2526 輸出: 131*131*379*479*491 191*241*269*331*571 193*197*199*227*409 103*131*293*431*487 53*67*107*211*347 127*137*167*239*269 349*439*571*571 263*409*563*571 149*307*409*419*599

139*257*271*401*541 229*257*263*409*587 173*223*353*359*523 61*137*353*419*439 281*283*317*349*463 173*251*317*449*487 83*257*277*277*359 103*107*227*263*439 67*71*211*251*271

53*113*127*257*307 131*193*373*421*577 89*227*419*499*509 53*83*227*233*313 151*211*349*487*521 193*401*541*569 101*239*271*419*433 71*137*211*281*439 89*109*113*199*239

211*239*313*569*587 79*157*397*439*463 97*109*277*439*509

說明:從數學上講,抵押貸款的工作原理如下:

1.從銀行借了一大筆錢;

2.銀行告訴你它的利率r,即債務的增長速度;

3.在每個月的月底,債務增加了r/12%;

4.在此之後,你向銀行提供了一些預定義的小筆錢以減少債務;

5.債務被認為是穩定的,當它的值降到零(這可能需要數年)。

例如,從銀行取p=80萬美元,利率r=6%,在每個月底支付m=10000美元。

month     p        p * (r/12)%      -m       new p

1 $800000 $4000 -$10000 $794000

2 $794000 $3970 -$10000 $787970

3 $787970 $3940 -$10000 $781910...

12 $732325 $3662 -$10000 $725987...

24 $654138 $3271 -$10000 $647408...

103 $4188 $21 -$4209 $0

因此,在103個月(約為8.5年)之後,債務可能會得到償還。最後的支付當然可能小於m(因為p不需要變成負數)。

輸入資料:包含貸款大小p、利率r和時間長度的值l,在幾個月內償還。

答案:應該包含每月支付的m整數(如果你得到非整數結果,把它增加到最近的整數)。

例如:

input data:

800000 6 103answer:

9957

測試資料:

600000 8 114

**如下:

1 data =input().split()

2 p =int(data[0])

3 r = int(data[1])

4 l = int(data[2])56

defdebt(p, r, t):7#

每月還款的金額為: [ 本金 x 月利率 x(1+月利率)貸款月數的次方 ] / [(1+月利率)還款月數的次方 - 1]

8 m = round((p * (r / 1200) * (1 + r/1200) ** t) / ((1 + r/1200) ** t - 1))

9returnm10

11 case =debt(p, r, l)

12print

(case)

1314 輸出:7531

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

演算法學習 KM演算法

km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配 如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧 首先 理解km演算法前 必須有以下3個概念 1.可行頂標 對於乙個賦值二分圖g x,y,e,w x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ...

演算法 演算法學習01

貪婪 可以理解為最簡單基礎的求解方式,特點是 短視性 從這個特點入手很容易理解每一步取其最優的原理。雖然最終結果不一定是最好的,但是一定是較好的而且是最簡便的。因此在不過分追求最優結果或者對速度的要求高於結果的情況下,貪婪是不錯的選擇。分治可以理解為大事化小小事好搞,與貪婪的每一步的 串聯 不同,分...