问题:
现在要求n以内的素数中,能表示为最多连续素数之和的那个数,如果有多个答案,请输出最大的那个素数。
输入
仅一行,一个整数n,1<=n<=10000
输出
输出就一个整数,为所求的能表示为最多连续素数和的那个素数。
样例输入与输出
输入:100
输出:41
思路分析:
题目要求找[1,n]范围内能表示为最多个连续素数和的素数并输出(如果有多个输出最大的)
首先找到一定范围内所需要的素数并存储,然后在找出不大于n的最大素数下标x,暴力枚举所有prime[0]~prime[x]里所有组合,就可以得到答案了
代码:
#include<iostream>
#include<math.h>
#include<cstring>
using namespace std;
const int MAXN = 1000010;
int p[MAXN], prime[MAXN], s[MAXN], t=0;//prime 存储所有的prime
void searchprime() {
memset(p, 0, sizeof p);//对p数组初始化
//memset(prime, 0, sizeof prime);
for (int i = 2; i <= sqrt(MAXN); i++) {
if(p[i])continue;//如果当前是素数则下一个
for (int j = pow(i,2); j < MAXN; j = j + i) {
p[j] = 1;//标记i所有倍数都不是素数
}
}
for (int i = 2; i <MAXN; i++) {
if (!p[i])prime[t++] = i;//如果p[i]==0则说明是素数 存储到prime中
}
}
int main() {
long long int n;
cin >> n;
searchprime();
int x;
int maxlen = 0;
for ( x = 0; x <=t; x++) {
if (prime[x] > n)break;//找到不大于n的最大素数,下标为x-1
}
for (int i = 0; i < x; i++) {//暴力枚举
int sum = 0;
for (int j = i; j < x; j++) {
sum = sum + prime[j];
if (sum > n)break;
if (!p[sum]) {//如果当前和是素数
s[j - i + 1] = max(sum, s[j - i + 1]);//s存储相同区间长度最大组合
maxlen = max(j - i + 1, maxlen);//跨的区间长度越长说明和越大
}
}
}
cout << s[maxlen] << endl;
}