/*
思路:先枚举首项,再枚举公差,后枚举个数。(个数就是当前这个公差能不能够枚举到10个)
标题:等差素数列
2,3,5,7,11,13,….是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
*/
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int N = 5000;
typedef long long ll;
ll a[N];
set<int> all;
//判断是否为素数
bool isPrime(ll t){
for(int i=2; i<t/2; i++){
if(t % i == 0){
return false;
}
}
return true;
}
//
int f(ll a[], int n){
for(int i=0; i<n; i++){
//枚举首项
ll first = a[i];
//枚举公差,极限也就是最大公差就是最后一个数减去首项。
for(int delta=1; delta<a[n-1] - first; delta++){
int m = first;
//利用当前枚举出来的首项与当前枚举出来的公差相加
for(int j=1; j<10; j++){
m += delta;
//在事先保存好素数的set容器里找这个m。找不到,m不是素数就跳出
if(all.find(m) == all.end()){
break;
}
//m超过了范围内的最大素数也跳出
if(m > a[n - 1]){
break;
}
//首项加了9次公差的时候则返回公差
if(j == 9){
return delta;
}
}
}
}
return -1;
}
int main(){
a[0] = 2;
a[1] = 3;
all.insert(2);
all.insert(3);
int index = 2;
ll t = 5;
while(index < 5000){
//是素数就放进数组和set里面去
if(isPrime(t)){
a[index++] = t;
all.insert(t);
}
t++;
}
cout << f(a, N) << endl;
return 0;
}
等差素数列
最新推荐文章于 2021-05-24 17:18:16 发布