sdut oj 2404 super prime(素数筛)

题目链接:点击打开链接

题目大意:

We all know, prime is a kind of special number which has no other factors except of 1 and itself.
2,3,5,7,11,13,17,19,23,29 are the top 20 primes.
Now there is a new question about prime:
We call a prime as super prime when and only when which can be represented as the sum of multiple continuous primes. For example: 5=2+3, so 5 is a super prime.
Please program to judge whether a number is a super prime or not.

输入

The first line is an integer T (T<=1000), and then T lines follow.
There is only one positive integer 
N(1<N<100000).

输出

For each case you should output the case number first, and then the word "yes" if the integer N is a super prime, and you should output "no" otherwise.

示例输入

3
5
7
8

示例输出

Case 1: yes
Case 2: no
Case 3: no

来源:山东省赛(第三届)(热身赛)

代码:

///Super Prime
#include <iostream>
#include<cmath>
#include<cstring>
#include<cstdio>using namespace std;int main()
{int h=100100;int q[100100];memset(q,0,sizeof(q));q[0]=q[1]=1;int w=sqrt((double)h)+1;int p,t,k;for( p=2; p<=w; p++){if(q[p]==0){for(t=p; t*p<=h; ++t){if(q[t]==0){for(k=p*t; k<=h; k*=p){q[k]=1;}}}}}int y[10000];int top=0;for(int i=0; i<=h; i++){if(q[i]==0) y[top++]=i;}int x,n;cin>>x;for(int i=1; i<=x; i++){cin>>n;if(q[n]==1||n==2||n==3||n==7){printf("Case %d: no\n",i);}else{for(int j=0;j<top;j++){if(y[j]==n){p=j;break;}}int front=p ,back=p;int sum=0;front--;back--;back--;sum=sum+y[front];sum=sum+y[back];int f=0;while(1){if(sum>n){sum=sum-y[front];front--;if(back==front){if(back==0){f=0;break;}back--;sum=sum+y[back];}}if(sum==n){f=1;break;}else{if(back==0){f=0;break;}back--;sum=sum+y[back];}}if(f==0)printf("Case %d: no\n",i);else printf("Case %d: yes\n",i);}}
return 0;
}