2017第八屆C/C++B組省賽——等差素數列
阿新 • • 發佈:2019-02-13
標題:等差素數列
2,3,5,7,11,13,....是素數序列。
類似:7,37,67,97,127,157 這樣完全由素陣列成的等差數列,叫等差素數數列。
上邊的數列公差為30,長度為6。
2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!
有這一理論為基礎,請你藉助手中的計算機,滿懷信心地搜尋:
長度為10的等差素數列,其公差最小值是多少?
2,3,5,7,11,13,....是素數序列。
類似:7,37,67,97,127,157 這樣完全由素陣列成的等差數列,叫等差素數數列。
上邊的數列公差為30,長度為6。
2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!
有這一理論為基礎,請你藉助手中的計算機,滿懷信心地搜尋:
長度為10的等差素數列,其公差最小值是多少?
注意:需要提交的是一個整數,不要填寫任何多餘的內容和說明文字。
分析:要求等差素數數列,第一步肯定是需要將素數數列求出來,這裡直接採用篩選法求素數,其實填空題也完全可以直接用列舉法求素數,不用考慮時間複雜度的問題。然後開始列舉,從第一個素數開始,公差d從1開始,暴力列舉!
ans:210#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; }