需求:求得一定範圍內的素數。
方法:
試除法:
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...