没事写代码之连续质数

来源:互联网 发布:java 中getbean 编辑:程序博客网 时间:2024/05/22 17:42

好久没写博了,前段时间有空,就参加了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调试通过)

为开源贡献自己的一点热情吧,呵呵。源码和程序分开了,自己按需取吧。

原创粉丝点击