2018年蓝桥杯--省赛b组B题---等差素数列

等差素数列

问题描述:

2,3,5,7,11,13,…是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为10的等差素数列,其公差最小值是多少?

注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

思路

使用埃式筛选法,假设1----1000001都是素数 然后进行线性素数筛选(欧式当然就更优了,但这里埃筛就已经够用了,埃筛也比较好写
(^ _ ^)

code:

#include<stdio.h>
#include<string.h>

int isPrime[1000001];
int Prime[999999]={
    
    0};

int main(){
    
    
	int len=0;
	for(int i=0;i<1000001;i++){
    
    
		isPrime[i]=1;	
	}
	
	isPrime[0]=0;
	isPrime[1]=0;
	isPrime[2]=1;
	
	for(int i=2;i<1000001;i++){
    
    
		if(isPrime[i]==1){
    
    
			Prime[len++]=i;
			for(int j=2*i;j<1000001;j+=i){
    
    
				isPrime[j]=0;
			}
		}else{
    
    
			continue;
		}
	}
	int ans=0;
	for(int k=5;k<=1000;k++){
    
    
	//这里假设最小公差不超过1000,也可以直接while(1),找到直接后输出再return 0;
		for(int i=0;i<len-10;i++){
    
    
			int cnt=0;
			for(int p=0;p<10&&Prime[i]+p*k<100001;p++){
    
    
				if(isPrime[Prime[i]+p*k])cnt++;
			}
			if(cnt==10){
    
    
			printf("%d",k);
			return 0;
			}
		}
	}
	return 0;
}

最终答案:
210

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/115414267