小白的pythion冒險之旅
阿新 • • 發佈:2022-03-02
質數(prime number)又稱素數,有無限個。
質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。
除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
任意大於等於5的素數都與6的倍數相鄰。
如果n是一個合數,那麼n一定有一個不超過sqrt(n)的素因子。
判斷一個數是否是素數的思路
在一般領域,對正整數n,如果用2到sqrt(n)之間的所有整數去除,均無法整除,則n為質數。
方法一
bool isprime(int x) { for (int i=2;i<x;i++) { if (x%i==0) return false; } return true; }
方法二
bool isprime(int x) { for (int i=2;i*i<=x;i++) { if (x%i==0) return false; } return true; }
篩素數法
篩素數法可以比列舉法節約極大量的時間(n為所求最大值,m為≤n的質數個數,那麼列舉需要O(m*n)的時間複雜度,而篩素數法為O(m+n),顯然m<<n,所以時間效率有很大提升。)。如1000000的資料範圍,用篩素數法可在2s內解決。
思路:建立一個bool型陣列M,若已知一個數M[k]是質數,那麼其i(i為正整數)倍M[k*i]必然為合數,可將其去除。
bool Isprime[Maxn]; void prime(int x) { memset(Isprime,true,sizeof(Isprime)); Isprime[1]=0; for (int i=2;i<=x;i++) { for (int j=2;i*j<=x;j++) Isprime[i*j]=0; } return; }