等差素数列
2,3,5,7,11,13,….是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
#include <iostream>
#include <cmath>
using namespace std;
int prime[1000000], primeSign[1000000] = {1, 1, 0};
bool isPrime(int n) {
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0)
return false;
return true;
}
int main() {
int i, j, k, t, temp = 0;
for (i = 2; i < 1000000; i++) {
if (isPrime(i)) { //判断是不是素数
prime[temp++] = i;//存储起来
primeSign[i] = 0;//用0标记i是素数
} else {
primeSign[i] = 1;//用1标记i不是素数
}
}
for (i = 0; i < 1000000; i++) {
t = prime[i];
for (j = 1; j < 100000; j++) { //从1到100000,枚举公差j
for (k = 1; k < 10; k++) { //k为序列的数的个数
if (primeSign[t+j*k])
break;
}
if (k == 10) { //当满足k为10时,返回最小公差j即可
cout << j;
return 0;
}
}
}
return 0;
}
方法二:线性筛法
#include <iostream>
#include <cmath>
#include <string.h>
using namespace std;
int prime[1000000], isPrime[1000000];
void shai() { //线性筛法
int i, j, num = 0;
for(i = 2; i < 1000000; i++) {
if(isPrime[i])
prime[num++] = i;
for(j = 0; j < num && i * prime[j] < 1000000; j++) {
isPrime[i * prime[j]] = 0;
if(i % prime[j] == 0) break;
}
}
}
int main() {
int i, j, k, t, temp = 0;
memset(prime, 0, sizeof(prime)); //存储素数
memset(isPrime, 1, sizeof(isPrime)); //1代表是素数 0代表不是素数
shai();
for (i = 0; i < 1000000; i++) {
t = prime[i];
for (j = 1; j < 100000; j++) { //从1到100000,枚举公差j
for (k = 1; k < 10; k++) { //k为序列的数的个数
if (isPrime[t+j*k] == 0)
break;
}
if (k == 10) { //当满足k为10时,返回最小公差j即可
cout << j;
return 0;
}
}
}
return 0;
}