最强素数(100 分)
2018-03-28 20:05
169 查看
小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。 素数41能写成连续6个素数之和:41=2+3+5+7+11+13。 现在要求n以内的素数中,能表示为最多连续素数之和的那个数,如果有多个答案,请输出最大的那个素数。
由于看到时间限制是10000ms,所以一开始大胆采用了暴力O(n^2)做法,结果居然就过了……首先先用个素数筛法算出所有素数并且存在一个prime数组里方便后面使用。找出prime数组里不大于n的最大素数的下标,接着暴力枚举prime[0]~prime[a]里的所有组合,得到答案。#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <stack>
#include <string>
#include <queue>
#include <set>
#include <list>
using namespace std;
const int MAX_SIZE = 1000000 + 10;
int p[MAX_SIZE], prime[MAX_SIZE], save[MAX_SIZE], t;
void fun() {
t = 0;
memset(p, 0, sizeof p);
for (int i = 2; i <= sqrt(MAX_SIZE); i++) {
if (p[i]) continue;
for (int j = i * i; j < MAX_SIZE; j += i) p[j] = 1;
}
for (int i = 2; i < MAX_SIZE; i++)
if (!p[i]) prime[t++] = i;
}
int main() {
fun();
int n, a, max_cnt = 0;
cin >> n;
for (a = 0; a < t; a++)
if (prime[a] > n) break;
save[1] = prime[a - 1];
for (int i = 0; i < a; i++) {
int tmp = 0;
for (int j = i; j < a; j++) {
tmp += prime[j];
if (tmp > n) break;
if (!p[tmp]) {
save[j - i + 1] = max(tmp, save[j - i + 1]);
max_cnt = max(j - i + 1, max_cnt);
}
}
}
cout << save[max_cnt] << endl;
}
输入格式:
仅一行,一个整数n。输出格式:
输出就一个整数,为所求的能表示为最多连续素数和的那个素数。输入样例:
100
输出样例:
41【样例说明】 41=2+3+5+7+11+13 【数据规模】 30%的数据,1<=n<=1000 60%的数据,1<=n<=10000 80%的数据,1<=n<=100000 100%的数据,1<=n<=1000000
由于看到时间限制是10000ms,所以一开始大胆采用了暴力O(n^2)做法,结果居然就过了……首先先用个素数筛法算出所有素数并且存在一个prime数组里方便后面使用。找出prime数组里不大于n的最大素数的下标,接着暴力枚举prime[0]~prime[a]里的所有组合,得到答案。#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <stack>
#include <string>
#include <queue>
#include <set>
#include <list>
using namespace std;
const int MAX_SIZE = 1000000 + 10;
int p[MAX_SIZE], prime[MAX_SIZE], save[MAX_SIZE], t;
void fun() {
t = 0;
memset(p, 0, sizeof p);
for (int i = 2; i <= sqrt(MAX_SIZE); i++) {
if (p[i]) continue;
for (int j = i * i; j < MAX_SIZE; j += i) p[j] = 1;
}
for (int i = 2; i < MAX_SIZE; i++)
if (!p[i]) prime[t++] = i;
}
int main() {
fun();
int n, a, max_cnt = 0;
cin >> n;
for (a = 0; a < t; a++)
if (prime[a] > n) break;
save[1] = prime[a - 1];
for (int i = 0; i < a; i++) {
int tmp = 0;
for (int j = i; j < a; j++) {
tmp += prime[j];
if (tmp > n) break;
if (!p[tmp]) {
save[j - i + 1] = max(tmp, save[j - i + 1]);
max_cnt = max(j - i + 1, max_cnt);
}
}
}
cout << save[max_cnt] << endl;
}
相关文章推荐
- 7-7 最强素数(100 分) 【前缀和】
- 用筛选法求出100以内的全部素数,并按每行五个数显示。(C#)
- C语言求解素数(质数)的优化:打印100-200之间的素数
- 编写一个程序计算100以内的smith数,smith数的概念: 一个非素数,其各位数之和等于其所有质因数的个位数之和。 例如:4=2*2,4=2+2
- 016.循环语句进行100以内素数求和
- 筛选法求100以内的素数
- 判断并打印100~200间素数
- C冒泡排序 @100到200素数
- 判断1-100之间有多少个素数并输出所有素数(方法的调用)
- 求1到100之间的素数
- Java课后习题——编写程序求100以内的素数并输出
- 打印100以内的素数
- 求1到100内的素数
- 习题 6.1 用筛选法求100之内的素数。
- 题目:求100以内的素数,全部打印出来。
- 求100——200间的全部素数!C语言编程!
- 找到100~200之间的素数
- 输出100~200之间的素数
- 习题:输出1-100之间的所有质数(素数)
- 求100以内的素数的和