解题步骤:
- 埃氏筛法生成素数列
- 枚举首项
- 枚举公差
- 检查是否够10个长度
set s;
*坑:set中的最后一个元素为(s.rbegin()),find(x)如果找到就返回在容器中的下标,否则就返回s.end()
代码:
#include <iostream>
#include <set>
#define N 5000
using namespace std;
typedef long long ll;
set<ll> s;
//埃氏筛法-生成素数列
bool is_prime[N]; //辅助工具 void init(){
for(ll i = 2;i <= N;i++){
is_prime[i] = true;}
}void isPrime(){
for(ll i = 2;i <= N;i++){
if(is_prime[i]){
s.insert(i);for(ll j = 2*i;j <= N;j+=i){
{
is_prime[j] = false; //查看后面的是不是素数 }}}}
}int solve(){
set<ll>::iterator it = s.begin();for(;it != s.end();it++){
//枚举首项 int first = *it; //首项 for(ll delta = 1;delta < (*s.rbegin()-first);delta++){
//枚举公差,*s.rbegin()返回的是set中最后一个元素 int m = first;for(int len = 1;len<10;len++){
//枚举长度m+=delta; //首项加上公差 if((s.find(m))== s.end()){
//如果找不到break; } if(len == 9) return delta;}} }return -1;
}int main(){
init();isPrime();cout << solve() << endl;return 0;
}
结果:
埃氏筛法链接