题目描述:
2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
题目答案:
210
题目思路:
素数筛选出100000以内的素数,暴力枚举,如果没有答案,那么就将范围扩大。
题目代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 100001
using namespace std;
// p[i]表示第i个素数
// dp[i] = 1 表示i是合数,=0表示是素数
int p[N], tot = 0;
int dp[N];void table(){memset(dp, 0, sizeof(dp));dp[0] = dp[1] = 1;for(long long i = 2; i < N; i++){if(dp[i]) continue;p[tot++] = i;for(long long j = i; j * i < N; j++){dp[i*j] = 1;}}
}int main(){table();printf("%d\n",tot);for(int i = 1; i < 500; i++){ // 差 for(int j = 0; j < tot; j++){ // 起始位置 int flag = 1;for(int k = j; k < j+10 ; k++){ // 区间长度10 if(dp[p[j]+(i*(k-j))] || p[j]+(i*(k-j)) >= N ){flag = 0; // 起始位置素数加上差后不是素数 break; // 或加上差后超出范围 flag = 0; }}if(flag){ printf("p[j]:%d j:%d i:%d\n",p[j],j,i);break;}}}return 0;
}