HDU1397

题目链接

传送门

题目大意

题目大意就是给你一个n,把n拆成两个素数和形式。问有几个这样的素数集合。

解题思路

先打个素数表,然后开始遍历素数表,为防止集合发生重复(例如(a,b)、(b,a)这种情况),所以
循环到n/2(包含n/2),当其中一个素数确定后,只要判断另一个数是不是素数就好了·····这时候可以
直接使用打表时用到的ispri数组来直接判断(不然用朴素判断会超时)

参考代码

#include <functional>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <numeric>  
#include <cstring>  
#include <climits>  
#include <cassert>  
#include <complex>  
#include <cstdio>  
#include <string>  
#include <vector>  
#include <bitset>  
#include <queue>  
#include <stack>  
#include <cmath>  
#include <ctime>  
#include <list>  
#include <set>  
#include <map>  
using namespace std;  

#pragma comment(linker, "/STACK:102400000,102400000")  

typedef long long LL;  
typedef double DB;  
typedef unsigned uint;  
typedef unsigned long long uLL;  

/** Constant List .. **/ //{  

const int MOD = int(1e9)+7;  
const int INF = 0x3f3f3f3f;  
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;  
const DB EPS = 1e-9;  
const DB OO = 1e20;  
const DB PI = acos(-1.0); //M_PI;  
const int maxn = 100001;  
bool ispri[maxn];  
int pri[maxn];  
int t;  

void dopri()  
{  
    memset(ispri , true , sizeof(ispri));  
    ispri[0] = ispri[1] = false;  
    t = 0;  
    for(int i = 2; i <= maxn ; i ++)  
    {  
        if(ispri[i])  
        {  
            pri[t ++] = i;  
            for(int j = i * 2 ; j <= maxn ; j += i)  
                ispri[j] = false;  
        }  
    }  
}  

int main()  
{  
    #ifdef DoubleQ  
    freopen("in.txt","r",stdin);  
    #endif  
    int n;  
    dopri();  
    while(~scanf("%d",&n) && n)  
    {  
        int cnt = 0;  
        for(int i = 0 ; pri[i] <= n / 2 ; i ++)  
        {  
            int  k = n - pri[i];  
            if(ispri[k])  
                cnt ++;  
        }  
        printf("%d\n",cnt);  
    }  
}  

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

© 2018-2019 惜春令 京ICP备18010644号 网站地图