1. 程式人生 > >第八屆藍橋杯【省賽試題2】等差素數列

第八屆藍橋杯【省賽試題2】等差素數列

題目描述:

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;
}