算法设计实验报告1_V2版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中山大学移动信息工程学院本科生实验报告
(2015学年春季学期)
课程名称:Algorithm design 任课教师:
实验1 1259. Sum of Consecutive Primes
1.实验题目
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations does a given positive integer have? For example, the integer 53 has two representations 5 + 7 + 11 + 13 + 17 and 53. The integer 41 has three representations 2+3+5+7+11+13, 11+13+17, and 41. The integer 3 has only one representation, which is 3. The integer 20 has no such representations. Note that summands must be consecutive prime
numbers, so neither 7 + 13 nor 3 + 5 + 5 + 7 is a valid representation for the integer 20.
Your mission is to write a program that reports the number of representations for the given positive integer.
Input
The input is a sequence of positive integers each in a separate line. The integers are between 2 and 10 000, inclusive. The end of the input is indicated by a zero.
Output
The output should be composed of lines each corresponding to an input line except the last zero. An output line includes the number of representations for the input integer as the sum of one or more consecutive prime numbers. No other characters should be inserted in the output.
Sample Input
2
3
17
41
20
666
12
53
Sample Output
1
1
2
3
1
2
2.实验目的
掌握快速打印素数表的方法,比如素数筛法,以及对素数筛法进行优化。
3.程序设计
解题思路:先打印10000以内的素数表。对每个输入值,枚举连续的素数
的起点,寻找是否有一段连续的素数与它相等,如果有则累加答案。
求素数算法原理:
打印素数是一个比较基础的问题,掌握求素数的方法因而也是一项基本功。(1)暴力:如果题目只需要判断少量数字是否为素数,可以直接枚举因子
2...sqrt(N),检验是否整除N;只需要枚举到sqrt(N)的原因很直观,如果
N在
(2)排除法:根据课堂上的学习,我们知道算法如果写成线性算法,也就是O(n),已经算是不错了,但是最好的是O(Log(n))的算法,这是一个对数级的算法,二分取中(Binary Search)正是O(Log(n))的算法。通常来说,O(Log(n))的算法都是以排除法做为手段的。所以,找质数的算法完全可以采用排除法的方式。如下所示,这种算法的复杂度是O(n(log(logn)))。
但是一般题目中要用到判断素数和求素数,数据规模也比较大的话,一般不用这种直接求法。实际中的算法是,我把质数事先就计算好,放在一个文件中,然后在程序启动时(注意是在启动时读这个文件,而不是运行时每调用一次就读一次文件),读取这个文件,然后打印出来就可以了。如果需要查找的化,二分查找或是hash表查找将会获得巨大的性能提升。当然,这样的方法对于空间来说比前面两个都要消耗得大,但是你可以有O(log(n))或是O(1)的时间复杂度。
参考一些打印素数的方法:/articles/3738.html
正则表达式检查素数(好像很NB的样子):/articles/2704.html /archives/algebra-with-regexes
(3)素数筛法:任何合数都能表示成一系列素数的积。
一般的素数筛法:初始时,假设全部都是素数,当找到一个素数时,这个素数乘上另外一个数之后都是合数,把这些合数都筛掉(标记)。
这种算法缺点:会造成重复筛除合数,影响效率。比如10,在i=2的时候,k=2*15筛了一次;在i=5,k=5*6 的时候又筛了一次。所以,也就有了快速线性筛法。快速线性筛法:不重复筛选(但是算法的时间复杂度不是O(n))