標題:等差素數列算法
2,3,5,7,11,13,....是素數序列。
相似:7,37,67,97,127,157 這樣徹底由素數組成的等差數列,叫等差素數數列。
上邊的數列公差爲30,長度爲6。數組
2004年,格林與華人陶哲軒合做證實了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!函數
有這一理論爲基礎,請你藉助手中的計算機,滿懷信心地搜索:spa
長度爲10的等差素數列,其公差最小值是多少?3d
注意:須要提交的是一個整數,不要填寫任何多餘的內容和說明文字。code
絮絮不休(罵罵咧咧blog
一開始看到這道題仍是有點懵的,畢竟我個數學小白,對素數什麼的最發怵了。數學
而後找了好多大佬的題解都沒看明白,甚至有一個大佬的代碼看的我暈頭轉向~string
而後終於被我找到一份能看懂而且以爲很是正確的代碼,思路以下:it
兩層循環,一層循環用於循環公差,一層循環用於循環起始素數。
須要注意的是,內層循環起始素數的時候,不能無邊界循環下去,要設置一個上限,不然外層循環永遠沒法走到下一個公差(本身寫的時候自覺得是犯的錯
內層循環走的時候,只須要判斷:
①這個數是否是素數(做爲起始素數最基本的條件)
②判斷從這個素數開始,以cha爲公差可否存在連續10個等差的素數。【用ok函數來判斷的】
若是以上兩個條件都知足,則這就是咱們要找的長度爲10的等差素數列,其公差的最小值
由於咱們是從小到大找的,那咱們找到的知足條件的第一個就是答案~
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; const ll maxn=1e6+50; ll a[maxn]; bool ok(ll n,ll cha) { for(ll i=0;i<10;i++) { if(!a[n+i*cha])return 0; } return 1; } int main() { a[1]=0; a[2]=1; a[3]=1; for(ll i=4;i<=1000000;i++) { bool flag=0; for(ll j=2;j*j<=i;j++) { if(i%j==0) { flag=1; break; } } if(flag)a[i]=0; else a[i]=1; } for(ll cha=1;;cha++) { for(ll i=2;i<1000000;i++) { if(a[i]&&ok(i,cha)) { printf("%lld\n",cha); return 0; } } } }
其實我對素數一直都懷有敬畏之心,但願能找個時間把素數的相關算法摸摸透,把板子整理齊全~(先給本身挖個坑
要是整理好了,我就把連接更新上來!(咕咕咕~