sdut oj 2404 super prime(素数筛)

来源:互联网 发布:redis同步mysql 编辑:程序博客网 时间:2024/06/06 17:33

题目链接:点击打开链接

题目大意:

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.

示例输入

3578

示例输出

Case 1: yesCase 2: noCase 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;}


0 0
原创粉丝点击