您的位置:首页 > 编程语言

没事写代码之连续质数

2011-06-30 11:13 239 查看
好久没写博了,前段时间有空,就参加了Intel多线程挑战赛,顺便写写自己的解题思路吧。

题目地址

注:欢迎大家转载,但请注明出处,谢谢http://blog.csdn.net/xinghun61/archive/2011/06/30/6576692.aspx

基本术语解释
连续完全幂(N, M)——N、M均为完全幂,N<M,且在N、M之间的自然数集合中(不含N、M),没有完全幂存在。
其中,N叫M的前驱,M叫N的后继
完全幂集(N, M)——指在N、M之间的所有自然数中的所有完全幂的集合。

解题思路
先将所有满足条件的质数计算出来,并将所有质数加起来,假设和为M,然后,计算完全幂集(4, M),最后,只要在所有质数组合中找到与完全幂集(4, M)中的元素的匹配项,就得到我们要的结果了。

关键算法分析
质数的计算比较简单,网上也能找到一堆代码,就不多说了。现在,关键是完全幂集(4, M)该如何计算呢?
我们知道最小的完全幂是4,那就从她开始,一个一个的找后继吧。
先上张图吧。



上图演示了如何通过已知的完全幂Nm,找到对应的后继Xy。换句话也就是说,通过遍历X,用上面的公式计算出对应的y值,然后,从所有X、y的组合中,找到使Xy最小的组合,就是我们要找的后继了。

另一个公式:



这个公式是判断2个完全幂的大小的,上面找Xy最小组合就是靠的她了。

已知的缺陷
1. 在计算完全幂集时,只有在知道了前驱之后,才能计算后继,导致只能在一个线程中处理,CPU内核(多核下)利用不充分。
2. 在计算机中,y * lgX / lgX ≠ y,因此,上面计算y的公式需要修改为y = Int(m * lgN / lgX + 1.0000000001),但这种误差的引入是否会对最终结果造成影响,暂时无法估计。

资源下载
Exe程序:地址
源代码:地址 (Delphi2010调试通过)
为开源贡献自己的一点热情吧,呵呵。源码和程序分开了,自己按需取吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: