求質數演算法之試除法

2021-08-03 23:18:28 字數 1014 閱讀 1447

需求:求得一定範圍內的素數。

方法:

試除法:

1.顧名思義,就是不斷地嘗試能否整除。比如要判斷自然數 x 是否質數,就不斷嘗試小於 x 且大於1的自然數,只要有乙個能整除,則 x 是合數;否則,x 是質數。

但是根據上述寫出來的固然可以得到素數,但是花費時間過多。以下是越來越簡化的思路:

思路1.

德**猜想,乙個偶數可以分解為兩個素數之和,其中乙個必然小於或等於這個偶數的一半。

所以不斷嘗試小於 x/2 且大於1的自然數,只要有乙個能整除,則 x 是合數;否則,x 是質數。

思路2:

除了2以外,所有可能的質因數都是奇數。所以,他們就先嘗試 2,然後再嘗試從 3 開始一直到 x/2 的所有奇數。

思路3:

因數都是成對出現的。比如,100的因數有:1和100,2和50,4和25,5和20,10和10。看出來沒有?成對的因數,其中乙個必然小於等於100的開平方,另乙個大於等於100的開平方。

所以只要從 2 一直嘗試到√x,就可以了。

思路4:

若是要求101以內的素數,就是從2嘗試到10,這之間有3和9,不能被3整除,肯定不能被9整除。

所以只要嘗試從2到√x之間的素數就可以,而這些數前面已經算出來了。

#include

#include

#define max 1000

int arr[max]=;

int f(int n)

if(qif(fabs(m-n)<=1)

break;

}for(j=0;jprintf("%d\n",arr[j]);

}int main()

還有一種篩選法也常常用於求素數:eratosthenes篩選法(c語言版)

試除法求約數

題目鏈結 模板 模板來自acwing vectorget divisors int x sort res.begin res.end return res 給定n個正整數ai,對於每個整數ai,請你按照從小到大的順序輸出它的所有約數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個整數ai。輸出...

演算法之求質數

問題 統計所有小於非負整數 n 的質數的數量。一開始直接使用暴力列舉法 public static intcountprimes int n return count public static boolean isprimes int n return true 發現在leetcode上會超出時間...

AcWing 866 試除法判定質數

題目描述 給定n個正整數ai,判定每個數是否是質數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出 yes 否則輸出 no 資料範圍 1 n 100,1 ai 2 10 9 輸入樣例 2 26輸出樣例 ye...