LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)

http://lightoj.com/volume_showproblem.php?problem=1259

题目大意:给你一个数n,这个数能分成两个素数a、b,n = a + b且a<=b,问有几组这样的(a,b)

比较简单的哥德巴赫猜想题,不需要多说,但一般的素数判定会TLE,所以这里用的是素数筛选法

这里需要注意的是筛选出来素数数组的大小

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;
typedef long long ll;
const int N = 1e7 + 10 ;

int prime[1000010];//这里数组大小要注意,小了会RE大了会MLE
bool Isprime[N];
int k;

void Prime()
{
    k = 0;
    memset(Isprime, true, sizeof(Isprime));
    Isprime[1] = false;
    for(int i = 2 ; i < N ; i++)
    {
        if(Isprime[i])
        {
            prime[k++] = i;
            for(int j = 2 ; i * j < N ; j++)
                Isprime[i * j] = false;
        }
    }
}

int main()
{
    int t, n, x = 0;
    scanf("%d", &t);
    Prime();
    while(t--)
    {
        x++;
        int num = 0;
        scanf("%d", &n);
        for(int i = 0 ; i < k && prime[i] <= n / 2 ; i++)
        {
            if(prime[i] <= n - prime[i] && Isprime[n - prime[i]])
                num++;
        }
        printf("Case %d: %d\n", x, num);
    }
    return 0;
}

 

posted @ 2015-11-04 09:59  午夜阳光~  阅读(513)  评论(0编辑  收藏  举报