题目链接:https://vjudge.net/contest/70017#problem/F
题意:求一个整数n能用多少对素数之和表示。(哥德巴赫猜想)
分析:先用素数筛法打表,再循环遍历判断一遍并计数。有两个需要注意的地方,一是素数筛法标记的时候用bool类型的数组,用int型会超内存;二是判断的时候不能再采用普通的枚举算法,会超时,直接判断素数部分和n减去这个数之后的数是不是素数就行了。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e7 + 5;
bool flag[maxn];
int prime[maxn/10];
void getPrime(){
memset(flag,0,sizeof(flag));
int cnt = 0;
for(int i=2;i*i<=maxn;i++)
if(!flag[i])
for(int j=i*i;j<=maxn;j+=i)
flag[j]=1;
for(int i=2;i<=maxn;i++)
if(!flag[i]) prime[cnt++]=i;
}
int main(){
getPrime();
int t,num,cas=1;
cin>>t;
while(t--){
int cnt=0;
cin>>num;
for(int i=0;prime[i]<=num/2;i++)
if(!flag[num-prime[i]])
cnt++;
cout<<"Case "<<cas++<<": "<<cnt<<endl;
}
}