1. 程式人生 > >2017第八屆C/C++B組省賽——等差素數列

2017第八屆C/C++B組省賽——等差素數列

標題:等差素數列


2,3,5,7,11,13,....是素數序列。
類似:7,37,67,97,127,157 這樣完全由素陣列成的等差數列,叫等差素數數列。
上邊的數列公差為30,長度為6。


2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!


有這一理論為基礎,請你藉助手中的計算機,滿懷信心地搜尋:


長度為10的等差素數列,其公差最小值是多少?


注意:需要提交的是一個整數,不要填寫任何多餘的內容和說明文字。

分析:要求等差素數數列,第一步肯定是需要將素數數列求出來,這裡直接採用篩選法求素數,其實填空題也完全可以直接用列舉法求素數,不用考慮時間複雜度的問題。然後開始列舉,從第一個素數開始,公差d從1開始,暴力列舉!

#include <stdio.h>
#include <memory.h>
using namespace std;
#define maxx 10000
int prime[maxx];//存放素數
int vis[maxx];//標記是否為素數,素數為1,非素數為0
int k=0;
void isprime( )//篩選法求素數
{
    memset(vis,1,sizeof(vis));//假設全部為素數
    vis[0]=0,vis[1]=0;
    for(int i=2; i<maxx; i++)
    {
        if(vis[i])//當前為素數
        {
            prime[k++]=i;
            for(int j=i; j*i<maxx; j++)//它的倍數一定不是素數
                vis[j*i]=0;
        }
    }
}
int fx()
{
    int i,d,n;
  for(i=0;i<k;i++)//列舉素數
{
    int x=prime[i];
    for(d=1;d<1000;d++)//列舉公差d
    {
        for(n=1;n<10;n++)//長度
        {
            if(!vis[x+n*d])
                break;
        }
        if(n>=10)
            return d;
    }
}
}
int main()
{
isprime();
printf("%d\n",fx());
    return 0;
}
ans:210