poj2262 - 素数判断

筛选法:

先把N个自然数按次序排列起来。

* 1不是质数,也不是合数,要划去。

* 第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。

* 2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。

* 3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。

* 这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

/*
poj2262 - 素数判断
题目大意:   给定一个数n,把它分解成两个素数的和,在这些分解中,这两个素数差要最大。
            6 <= n < 1000000
解题思路:先判断素数,然后枚举
解题心得:学会筛选法判断素数

*/

#include <iostream>

using namespace  std;
const int MAXN = 1000002;
int a[MAXN];

//int IsPrime(int x)
//{
//  if (x % 2 == 0)
//      return 0;
//  for (int i = 3; i*i <= x; i+=2)
//  {
//      if (x % i == 0)
//          return 0;
//  }
//  return 1;
//}

/*
筛选法对素数打表,O(N)
*/
void OddArray()
{
    int i, j;
    a[0] = 0;
    a[1] = 0;
    for (i = 0; i < MAXN; ++i)      //O(N)
        a[i] = 1;

    for (i = 2; i*i < MAXN; ++i)
    {
        if (a[i] == 1)              //O(N)
        {
            //只有当a[i] = 1时才需要执行a[j]=0,故a[j]=0执行的时间复杂度为O(N)
            for (j = 2*i; j < MAXN; j += i)     //O(N)
                a[j] = 0;
        }
    }
}

int main()
{
    int n;
    OddArray();
    while (cin >> n && n)
    {
        int i;
        for (i = 3; i <= n / 2; i += 2)
            //if (IsPrime(i) && IsPrime(n-i))
            if (a[i] && a[n-i])
                break;
        cout << n << " = " << i << " + " << n - i << endl;
    }

    return 0;
}
时间: 2024-10-13 05:36:01

poj2262 - 素数判断的相关文章

POJ 1811 大素数判断

数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; __int64 pri[]= {2,3,5,7,11,13,17,19,23,29,31};//用小素数表做随机种子避免第一类卡米

POJ1811 Prime Test(miller素数判断&amp;&amp;pollar_rho大数分解)

http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接上的一份代码,下面只是寄存一下这份代码,以后打印出来当模板好了. #pragma warning(disable:4996) #include <iostream> #include <cstring> #include <algorithm> #include <c

POJ3641 Pseudoprime numbers(快速幂+素数判断)

POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Carmichael Number 的简化版 /* * Created: 2016年03月30日 22时32分15秒 星期三 * Author: Akrusher * */ #include <cstdio> #include <cstdlib> #include <cstring&g

POJ 2262 Goldbach&#39;s Conjecture (素数判断)

Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37693   Accepted: 14484 Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conject

csu 1552: Friends(大素数判断+二分图)

1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MB Submit: 525  Solved: 136 [Submit][Status][Web Board] Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterres

POJ2262_Goldbach&#39;s Conjecture【素数判断】【水题】

Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38024 Accepted: 14624 Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conjecture:

POJ2909_Goldbach&#39;s Conjecture【素数判断】【水题】

Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10116 Accepted: 5973 Description For any even number n greater than or equal to 4, there exists at least one pair of prime numbers p1 and p2 such that n = p1 + p2 This c

模板C++ 02数论算法 1最大公约数 AND 2素数判断

2.1最大公约数Greatest Common Divisor 补充知识:x*y=最小公倍数*最大公约数 int Euclid(int a,int b) { if(b==0) return a; return Euclid(b,a%b); } 2.2素数判断Prime #include<cmath> bool Prime(int n) { int t=sqrt(n); for(int i=2;i<=t;i++) if(n%i==0) return false; return true;

有关素数判断的一些算法(总结&amp;&amp;对比)

素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型这种常用的开始讲起,这里采用模板题Luogu P3383 [模板]线性筛素数来进行测试 1.埃氏筛 这是最常用的筛法了,思路也很简单:任何一个素数的倍数都是合数 然后我们O(n)扫一遍,同时筛去素数的倍数 但是有一些数如6,会被2和3都筛去一次,就造成了效率上的浪费,所以复杂度经证明为**O(n log lo