最强素数

题目描述
小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。
素数41能写成连续6个素数之和:41=2+3+5+7+11+13。
现在要求n以内的素数中,能表示为最多连续素数之和的那个数,如果有多个答案,请输出最大的那个素数。

输入
仅一行,一个整数n(1<=n<=1000000)。

输出
输出就一个整数,为所求的能表示为最多连续素数和的那个素数。

样例输入
复制样例数据
100
样例输出
41

提示
41=2+3+5+7+11+13

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int prime[N],x[N],cnt,n;
void is_prime()       //找素数
{
    for(int i=2;i<=n;i++)
        {
        if(x[i]==0)
            {
            for(int j=i*2;j<=n;j+=i)
            {
                x[j]=2;
            }
            x[i]=1;
            prime[cnt++]=i;
        }
    }
}
int main()
{
    int len=0,ans=0,m;
    scanf("%d",&n);
    is_prime();
    for(int i=0;i<cnt;i++)    //从第一个开始
        {
        int t=0,tl=0;
        for(int j=i;j<cnt;j++)   //寻找到连续相加>=n,跳出来从下一个素数开始
        {
            tl++;
            t+=prime[j];
            if(t>n)  break;
            if(x[t]==1&&tl>=len) //记录答案ans
            {
                ans=t;
                len=tl;
            }

        }
    }
    printf("%d\n",ans);
    return 0;
}

posted on 2018-12-09 17:19  湫叶  阅读(177)  评论(0编辑  收藏  举报

导航