nefu2

来源:互联网 发布:话费充值平台源码 编辑:程序博客网 时间:2024/06/05 16:54

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php



思想:

        先把标记数组全置为1,is[0]和is[1]置为false(即0和1不是素数),然后从4开始把所有偶数置为

false,因为偶数不可能是素数。接下来外层从3开始到sqrt(N)遍历,因为偶数已被剔去,所以每次下标+2,。

内层用筛法思想把 i 的倍数置为false。至此,可能会想到下标2干嘛去了,因为刚开始把标记数组全

置为1,所以is[2]其实也就没有被置为false。最后用户敲一个n,从2到n / 2 +1 开始扫,如果is[i] 和is[n - i]

都是素数的话,即标记数组为1,则t++,记录t(素数对的个数)



解题代码:


#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define N 20000010

bool is[N];

int main()
{
    //freopen("in.txt","r",stdin);
    memset(is , 1 , sizeof(is));
    is[0] = is[1] = false;
    int e = (int)sqrt((double)N);
    for(int i = 4; i <= N; i += 2)
        is[i] = false;
    for(int i = 3; i <= e; i += 2)
        if(is[i])
        {
            for(int j = i + i ; j <= N; j += i)
                is[j] = false;
        }
    int n;
    while(scanf("%d",&n) != -1 && n)
    {
        int t = 0;
        for(int i = 2; i < n / 2 + 1 ; i ++)
            if(is[i] && is[n - i])
                t++;
        printf("%d\n",t);
    }
    return 0;
}


0 0