等差素数数列 最长合数段
题目:
给定闭区间[a,b] ,要求输出 连续的素数的等差序列,三个以上才算是序列,例如 [100,200] 会输出 151 157 163
再例如输入[1,100] 会有两个等差序列,3 5 7 和47 53 59。输出样式行末的空格保留。 a和b均小于10000
生成素数的方法很值得记录
还要注意一个小坑:特殊数字7829
7817 7823 7829
7829 7841 7853
两个数列,按题目的理解,它似乎是不用重复的数字,因此删去了第二个数列,但这一点没有在题目中说明,很坑。以下是允许重复的代码(懒得改了)
#include <iostream>
#include <cstdio>
#include <vector>
#define maxn (10010)
using namespace std;
int number[maxn];
vector<int> vec;
int main() {
for (int i = 2; i < maxn; i++) {
if (number[i] == 1) continue;
for (int j = i; ; j++) {
int re = i * j;
if (re >= maxn) break;
number[re] = 1;
}
}
for (int i = 2; i < maxn; i++) {
if (number[i] == 0)
vec.push_back(i);
}
int a, b;
scanf("%d%d", &a, &b);
for (int i = 0; i < vec.size(); i++) {
int count = 0;
if (vec[i] < a) continue;
if (vec[i+2] > b) break;
if (vec[i + 1] - vec[i] == vec[i + 2] - vec[i + 1]) {
count = 3;
printf("%d %d %d ", vec[i], vec[i + 1], vec[i + 2]);
while (1) {
i++;
if (vec[i + 2] > b) break;
if (vec[i + 1] - vec[i] == vec[i + 2] - vec[i + 1]) {
printf("%d ", vec[i + 2]);
}
else {
// 若要满足要求,加上i++; 即可
break;
}
}
printf("\n");
}
}
return 0;
}
最长合数段
给定区间[a,b],输出这个区间里最长的连续合数段,a和b均小于等于10000
#include <iostream>
#include <cstdio>
#include <vector>
#define maxn (10010)
using namespace std;
int number[maxn];
vector<int> vec;
int main() {
for (int i = 2; i < maxn; i++) {
if (number[i] == 1) continue;
for (int j = i; ; j++) {
int re = i * j;
if (re >= maxn) break;
number[re] = 1;
}
}
int a, b;
scanf("%d%d", &a, &b);
int start = 0, length = 0;
for (int i = a; i <= b; i++) {
if (number[i] == 1) {
int startNow = i, lengthNow = 1;
while (number[++i] == 1 && i <= b) {
lengthNow++;
}
if (lengthNow > length) {
start = startNow;
length = lengthNow;
}
}
}
for (int i = 0; i < length; i++) {
printf("%d ", i + start);
}
return 0;
}