素數判斷問題

2021-10-05 03:22:13 字數 1542 閱讀 4994

判斷素數還是很簡單的,兩種寫法

bool isprime(int n)

return true;

}

for迴圈裡面必須帶等號,必須帶.

這種是帶了開根號,也可以不開根號,for迴圈裡面那就是

1

for(int i= 2;i*i<=n;i++)

n在10^9以內是安全的.

有了上面的判斷素數的方法,似乎遍歷素數也很容易,直接迴圈判斷就好了.

不過,這樣並不是最優解,時間複雜度還是有優化的空間的.

再說一種方法:」埃式篩法」

因為這個簡單,容易理解,時間複雜度是o(nloglogn),尤拉篩法可以達到o(n),不介紹了,先說這個.

埃式篩法原理: 對每乙個素數,篩去他的所有倍數

比如列印0~100以內的素數,先確定2是素數,然後篩去2所有的倍數,然後依次向後,3沒有被它前面的數篩掉,所以3一定是素數,然後再篩3的倍數,依次是4,因為被2篩掉,所以不是質數….

#includeusing namespace std;

const int maxn = 101;

int prime[maxn], pnum = 0;

bool p[maxn] = ;

void find_prime()

} }}int main()

1

180=2*2*3*3*5

所以180質因子分解就是 2 3 5,在程式中怎麼儲存呢?

定義乙個結構體factor儲存:

struct facto***c[10];//10個長度夠用了,因為

//2*3*5*7*11*13*17*19*23*29的乘積已經超過int的範圍了.

剛才判斷質數的第一種寫法,是有著原理的,還是說一下吧:

對於乙個數n,如果他有除了1和它本身之外的因子,那麼應該分布在sqrt(n)的兩側成對出現.

現在這個結論對求質因子來說,同樣適用,可以做延伸.

如果乙個數n是又質因子乘積構成 ,那麼質因子要麼全都在sqrt(n)左側,要麼只有乙個出現在sqrt(n)的右邊

如此,便可以用這個來求解質因子了…

上面的prime陣列裡面存放的陣列,**就不在重複了,實現一下邏輯.

if(n%prime[i] == 0)

num++;//不同質因子個數加1

}

如果上面的步驟結束後n還大於1,說明有乙個大於sqrt(n)的質因子(有可能是n本身),這是需要把質因子加入fac陣列,並令其個數為1.

if(n != 1)
至此,fac陣列中存放的就是質因子分解的結果.

參考:《演算法筆記》

判斷素數問題

素數又稱質數。所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2 16 的任一整數整除。思路1 因此判斷乙個整數m是否是素數,只需把 m 被 2 m 1 之間的每乙個整數去除,如果都不能被整除,那麼 m 就是乙個素數。思路2 另外判斷方法還可以簡化。m 不...

判斷素數類問題彙總

注 暫時先記錄這些問題,後期再持續更新 int i,m printf enter a number scanf d m for i 2 i m 2 i if m i 0 break 若m能被某個i整除,則m不是素數,提前結束迴圈 if i m 2 m 1 若迴圈正常結束,說明m不能被任何乙個i整除 ...

利用孿生素數判斷素數

思路參見 孿生素數 所謂孿生素數指的是間隔為 2 的相鄰素數。大於6以上的孿生素數,p 1和p 1為素數,則p 1和p 1一定為奇數,則p一定為偶數,即p為2的倍數 p 1 p p 1為連續的自然數,他們一定有乙個是3的倍數,p 1和p 1為素數,則他們不為3的倍數,即p也為3的倍數 所以p一定為2...