算法学习(十二)

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
时间: 2024-11-05 12:30:37

算法学习(十二)的相关文章

每日算法之四十二:Permutation Sequence (顺序排列第k个序列)

The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312" "

算法学习(二) 全排列问题的非递归算法——模拟堆栈

前一段时间总结了全排列问题的几种递归解法,今天再总结一下如何通过对系统栈行为的模拟来非递归的实现全排列问题. 我们用一个数组stack[]来表示一个栈,用一个top指针来表示栈顶,用一个flags[]数组来标示每一个数字的可用性:用i来表示当前的状态. 初始状态top=0:i=-1:flags数组全为1: i递增,如果i没有越界并且flags[i]==1,那么就将i写入栈中,栈顶往前移动一位:最后把flags[i]赋值为0,i回溯到初始状态-1: 当栈顶越界,就将整个栈的信息打印出来,然后top

springMVC3学习(十二)--文件上传优化CommonsMultipartResolver

基于上一篇文件上传发现效率很慢,我们应该对它进行优化  使用springMVC对文件上传的解析器 来处理文件上传的时候需要在spring的applicationContext里面加上springMVC提供的MultipartResolver的申明 这样客户端请求的时候 springMVC会检查request里面是否包含多媒体信息 如果包含了就会使用MultipartResolver进行解析, springMVC会使用一个支持文件  处理的MultipartHttpServletRequest来包

SpringMVC学习(十二)——SpringMVC中的拦截器

SpringMVC学习(十二)--SpringMVC中的拦截器 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下SpringMVC中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. SpringMVC中拦截器的定义和配置 SpringMVC中拦截器的定义 在SpringMVC中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: public class Inter

排序算法学习整理二(选择)

9二.选择排序: 选择排序十分的简单和直观,其的工作原理是每一次从待排序的数组中选出最小(或最大)的一个元素,存放在序列的起始位置.因此,选择排序也是像我们这种萌新最容易写出来的排序算法. 排序步骤: 选出最小的元素 放在数组最前面 选出第二小的元素 放在第二位 重复如此直到完成排序 下面举个栗子: 有一个数组其元素如下 5 1 4 3 2 6 7 0 9,其选择排序流程如下 第一轮: 0 1 4 3 2 6 9 5 7 0最小,0和5换 第二轮: 0 1 4 3 2 6 9 5 7 1最小,不

【STL源码学习】STL算法学习之二

第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, class OutputIterator> OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result); 函数作用: 将[first,last)区间的元素拷贝至result开头的迭代器区间,并返回赋值

Java编程思想学习(十二) 数组和容器

一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同的话就是对象数组默认值为null,而基本数组视本身情况而定. 1 package lkl; 2 3 import java.util.Arrays; 4 5 ///下面演示了数组的初始化 6 //包括对象数组和普通数组 7 class Base{ 8 private static long count

Android学习十二---在android上实现图像匹配

一.效果图及功能描述 效果图 点击ShowImg后 点击match,然后点击showmatch,可以不断点击showmatch. 主要功能描述:显示在SD卡上已经存在的图片test.jpg,根据图片在cameraframe对于每一帧计算和test.ipg的匹配并显示. 二.界面设计 一个JavaCameraView用来显示帧相当于是相机的预览,两个ImgView一个用来显示要匹配的图像,一个用来显示最后得到的匹配图.三个Button对应三个View,ShowImg用来显示SD卡上的test.jp

开发h5斗地主大厅算法——第十二章の主动出牌(1)

本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来. 首先清空出牌序列 [cpp] view plain copy clsHandCardData.ClearPutCardList(); 主动出牌的策略按照优先级大体可以分为三类: [一]能直接一手牌出去,优先出. [二]两手牌出去且有绝对大牌,先出绝对大牌. [三]出一手牌使得接下来自己手牌价值最大化. [cpp] view plain copy //剪枝:如果能出去最后一手牌直接出 CardGroupData Sur

数据结构与算法学习(二)

线性表的链式存储结构:除了存储数据元素信息外,还要存储它的后继元素的存储地址(指针)即数据域和指针域,两部分为存储映像即结点(node),每个结点只包含一个指针域,则为单链表 把结点的第一个存储位置叫做头指针,最后一个结点指针为空NULL. 头指针和头结点的异同: 空链表: 头结点的数据域一般是空的,但是也可以存放链表的长度.头结点的指针指向第一个结点的地址. 在C语言中可以用结构指针表示单链表: typedef  struct Node {Elemtype  data;//数据域 struct