题意
找到长度为10的等差素数数列的最小公差是多少。
思路
找出素数
使用的是线性筛法求素数,用st[N]数组来记录,i这个数是否为素数。
连续判断st[t+len*d]是否为素数,直到len=10.
结论
小于等差素数列长度的所有素数的乘积 即为该数列的最小公差。
如该数列长度为10, 其中2,3,5,7小于10,结果为 2 ∗ 3 ∗ 5 ∗ 7 2*3*5*7 2∗3∗5∗7.
暴力
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
int n;
int primes[N];
bool st[N];
int cnt=0;
void is_prime(){//线性筛
for(int i = 2; i <= N; i++){
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] <= N/i; j++){
st[primes[j]*i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main(){
is_prime();
int idx = 1,len;
for(int i = 0; i < cnt; i++){
int t = primes[i];
// printf("i=%d,t=%d",i,t);
for(int d=1; d<=1e5; d++){
// t = t + d;
// while(idx != 10){//有逻辑bug
// if(st[t] == false){
// idx++;
// t = t + d;
// }
// else{
// break;
// }
// }
// if(idx == 10){
// cout <<"d = " << d << endl;
// return 0;
// }
// else{
// idx=1;
// break;
// }
for(len = 0; len < 10; len++){
if(st[t + d*len] == true){
break;
}
}
if(len == 10){
cout << d << endl;
return 0;
}
}
}
return 0;
}