没事写代码之连续质数
来源:互联网 发布: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调试通过)
为开源贡献自己的一点热情吧,呵呵。源码和程序分开了,自己按需取吧。
- 没事写代码之连续质数
- 没事写个帖子
- 没事写笔记
- 没事乱写写
- 没事晒晒代码
- 没事多敲敲代码
- 今天没事,写点东西
- 今天加班,没事写篇文章
- 没事写个冒泡排序
- 没事学习之。。。
- 写代码之余
- 每天写一点代码----连续子数组乘积最大
- 没事
- 没事
- 没事
- 没事
- TXT文件格式处理器---没事写个程序
- 没事,写个自动升级程序
- 开源框架Core Plot的使用
- (转)VC++编写ActiveX控件
- Oracle 卸载
- 为何看到美女会不高兴
- android opengl
- 没事写代码之连续质数
- 条款1:尽量用const和inline而不用#define
- Irrlicht 抗锯齿
- SQLITE3 使用总结
- 查看表和视图信息
- oracle biee - No log found
- firefox字体丑
- JSP页面访问MySQL数据库(1)
- foef与eof