POJ_2262
来源:互联网 发布:js获取title属性 编辑:程序博客网 时间:2024/06/07 05:09
思路:
线性筛选,计算出所有的小于1000000的素数,然后从头开始查找,找到的第一组就是差最大的。
notes:
提交的时候用c++明显要快,wa了很多次,但是把数组开成全局的并且使用宏定义替换了全局常量就ac了,被坑的很惨。
优化:
第一次写筛选法的时候,TLE了,后来进行了优化,优化的思路可以参考“筛法求质”http://blog.csdn.net/redraiment/article/details/2072005。
1. 除了2以外, 所有素数都是odd,因此可以先筛掉除2之外的所有偶数,之后再写筛选法的时候,从3开始,以+2为步长。
2. 判断一个数x是素数, 只需要x不能被小于等于sqrt(x)的所有素数整除就可以了。
3. 在使用一个素数x进行筛选的时候,因为2x, 3x, ......一直到比x小的上一个素数*x都已经在之前被筛选掉了,因此,可以从x * x开始进行筛选。
4. (代码中没有使用)除了2,所有的素数都是odd,所以x * x是odd,如果i是odd的话,则x * x + i * x是偶数已经被2筛选掉了,因此可以用+2x为步长。
//c++: 1108k 94ms//g++: 1332k 313ms#include <cstdio>#include <cstdlib>#include <cstring>#define MAX 1000000bool prim[MAX];int main() { memset(prim, 1, MAX); prim[0] = prim[1] = 0; for (int i = 4; i < MAX; i += 2) prim[i] = 0; for (int i = 3; i * i < MAX; i += 2) { if (!prim[i]) continue; for (int j = i * i; j < MAX; j += i) prim[j] = 0; } int even; while (scanf("%d", &even) && even) { int i; for (i = 3; i <= even / 2; i += 2 ) { if (prim[i] && prim[even - i]) { printf("%d = %d + %d\n", even, i, even - i); break; } } if (i > even / 2) printf("Goldback's conjecture is wrong.\n"); } return 0;}
- POJ_2262
- POJ_2262
- 哥德巴赫猜想(POJ_2262)
- poj_2262 Goldbach's Conjecture
- poj_2262 素数打表
- Poj_2262 Goldbach's Conjecture(筛法求素数)
- RelativeLayout 常用属性
- 数据库访问技术
- iOS下AsyncSocket网络库编程
- MySQL优化的奇技淫巧之STRAIGHT_JOIN
- Oracal的Lpad函数
- POJ_2262
- 使用valgrind检测Android native程序的内存
- 优秀IT技术文章集(最新)(高质量)
- GridView添加自定义控件
- Xp系统优化 打造一个安全的系统
- C++中指针和引用的区别
- 一个简单的c++面试题纠结了哈
- LVM 正确扩容方法及 扩容失败后超级块的恢复
- vc学习笔记之dll