思路:
一,从2开始枚举数,如果发现它是素数,则将sum(存储素数和的变量) 加上它,并把它存储在质数数组中,直到sum > n为止。
二,先枚举质数数组中开始位置(beg)然后判断如果(pris(1~n的素数个数) - beg + 1) < minn,说明beg~pris数组的右边界长度是小于目前算出来的答案的,那么就不需要再继续算下去。否则就继续,枚举结束位置(end)(看作一个[beg,end]的区间),将he(素数之和) += pri[end],然后判断如果he > n,则说明he已经不满足题目的条件了,直接break;最后在判断该区间的长度是否大于minn与he是否为质数,如果是的,则将minn,ans更新即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,pris = 1,sum,minn,ans,pri[10000001],he;
bool isp(int n)
{
for(int i = 2; i <= n / i; i++)
if(n % i == 0)
return 0;
return 1;
}
int main()
{
cin>>n;
for(int i = 2; i < n; i++)
{
if(sum <= n)
{
if(isp(i) == 1)
{
pri[pris++] = i;
sum += i;
}
}
else break;
}
for(int beg = 0; beg < pris; beg++)
{
he = 0;
if((pris - beg + 1) < minn)
{
cout<<ans;
return 0;
}
for(int end = beg; nd <= pris; end++)
{
he += pri[end];
if(he > n) break;
if((end - beg + 1) >= minn && isp(he) == 1)
{
minn = end - beg + 1;
ans = he;
}
}
}
cout<<ans;
return 0;
}