筛素数 poj 2739

题目链接:https://vjudge.net/problem/POJ-2739

输入一个数字n,判断有没有一段连续的素数之和大于n,如果有,计算总共有几种。

思路:用素数筛法求出10000以内的素数,然后可以用尺取法计算,我这里是计算先打表计算所有编号为i到编号为j的素数之和,然后再循环查找。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int vis[10010],num[1300],sum[1300][1300];
int n,m,k,t,cnt;
void play_table()
{
    memset(vis,0,sizeof(vis));
    memset(sum,0,sizeof(sum));
    cnt=0;
    for(int i=2;i<=10000;i++)
    {
        if(!vis[i])
        {
            num[++cnt]=i;//记录素数
            vis[i]=1;
            for(int j=i*2;j<=10000;j+=i)
            vis[j]=1;
        }
    }
    for(int i=1;i<=cnt;i++)//计算i到j的和
    {
        for(int j=i;j<=cnt;j++)
        {
            sum[i][j]+=sum[i][j-1]+num[j];
        }
    }
}
int main()
{
    play_table();
    while((cin>>n)&&n)
    {
        int ans=0;
        for(int i=1;i<=cnt;i++)
        {
            if(num[i]>n)
            break;
            for(int j=i;j<=cnt;j++)
            {
                if(sum[i][j]>n)
                break;
                if(sum[i][j]==n)
                {
                    ans++;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/6262369sss/p/9413714.html