算法学习(十二)

因式分解与贷款计算
本文介绍了因式分解算法及其实现,展示了如何通过厄拉多塞筛法找到素数并进行因式分解。此外,还讲解了贷款计算原理,包括如何计算每月还款金额,并给出了具体的实现代码。

1.Integer Factorization(因式分解)

说明:算法的基本定理,任何整数都可以表示为一个或多个素数的乘积,这样的表示是唯一的,例如:

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:
5
1000
1001
1002
1003
1009

answer:
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())  # 测试用例数
 2 
 3 def eladuosai(n): # 厄拉多塞筛法,构造素数
 4     l = list(range(1, n+1))
 5     l[0] = 0
 6     for i in range(2, n+1):
 7         if l[i-1] != 0:
 8             for j in range(i*2, n+1, i):
 9                 l[j-1] = 0
10     result = [x for x in l if x != 0]
11     return result
12 
13 prime = eladuosai(3000)
14 
15 for n in range(test_cases):
16     date = int(input().split()[0])
17     p_list = []
18     for p in prime:
19         while date % p == 0:
20             date = date / p
21             p_list.append(p)
22         if p > date:
23             break 
24     print('*'.join(str(m) for m in p_list), end=' ')   # 格式化输出
25 
26 输出: 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

 

2.Mortgage Calculator(贷款计算)

说明:从数学上讲,抵押贷款的工作原理如下:

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 103

answer:
9957

测试数据:

600000 8 114

代码如下:

 1 data = input().split()
 2 P = int(data[0])
 3 R = int(data[1])
 4 L = int(data[2])
 5 
 6 def debt(p, r, t):
 7     # 每月还款的金额为: [ 本金 x 月利率 x(1+月利率)贷款月数的次方 ] / [(1+月利率)还款月数的次方 - 1] 
 8     m = round((p * (r / 1200) * (1 + r/1200) ** t) / ((1 + r/1200) ** t - 1))  
 9     return m
10 
11 case = debt(P, R, L)
12 print(case)
13 
14 输出:7531

 

转载于:https://www.cnblogs.com/zt19994/p/7419757.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值