一般要判斷是是否為素數,我們通常找出了1和它本身之外是否存在可以被它整除的數。
接著對判斷可以進行優化,出去偶數,判斷的邊界設定為math.sqrt(number)。
如 以輸入101-200之間的素數為例
public static void fun1()else flag=true;
}if (flag)}}
還有一種時間複雜度上更加優秀的解法,就是埃式篩法:
給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,
把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......
static boolean isprime=new boolean[200] ;
public static void eratosthenes()
for (int i=2;i<200;i++)}}
}
埃氏篩法
時間複雜度 nlog(logn)
初始乙個布林陣列,全部記為 true ,先判斷2和2的倍數,全部為合數 記為false;
再判斷3和3的倍數,全部為合數,記為false;
以此類推,就是對所有合數和素數進行標記。
但是埃式篩法對於例如 16這樣的數,它是2的倍數,也是4,的倍數,也是8的倍數,也就是在標記時會對某些元素重複標記,因
此也可以對埃式篩法優化,也就是尤拉篩法 。
尤拉篩法:保證每個合數只會被它的最小質因數篩掉,時間複雜度降低到o(n)。
public static int euler()
for (int i=2;i<1000;i++)
for (int j = 0; j < count; j++)
isprime[i*prime[j]]=false;
//保證每個合數製備最小的因子篩掉
if (i % prime[j] == 0) }}
return prime;
}//參考位址
還有一種方法也是可以判斷是否為素數,叫做六素數法。
對於大於等於5的數字,我們可以用6的倍數來表示它,
即,6x-1, 6x, 6x+1, 6x+2, 6x+3, 6x+4的輪迴;
6x+2 = 2(3x+1), 6x+3 = 3(2x+1), 6x+4 = 2(3x+2), 6x顯然這些
並不是素數;那麼,我們可以總結為,對4以上的數字來說,
只有6的倍數的左右兩位才有可能是素數;
具體來講:如果判斷的數n%6!=-1或1的話,不符合就不是素數,
如果滿足條件,它有可能是質數,做進一步判定。
埃式篩法 尤拉篩法
埃氏篩法是通過從小到大篩去乙個已知素數的倍數進而實現篩選的。假如我們想篩掉1 100間的所有合數,步驟如下 2是質數,篩掉所有2的倍數 3是質數,篩掉所有3的倍數 4不是質數,跳過 5是質數,篩掉所有5的倍數 6不是質數,跳過 7是質數,篩掉所有7的倍數 8不是質數,跳過 9不是質數,跳過 10不是...
素數判斷 埃氏篩法和尤拉篩法(線性篩法)
埃氏篩法的原理是 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去 任何乙個大於1的自然數 n,如果n不是素數,都可以唯一分解成有限個素數的乘積。例...
素數篩法 埃氏篩及尤拉篩
在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...