[英]Java Prime Numbers
我正在嘗試列出質數表。 我已經對其進行了編碼,但它僅告訴我1-100的質數是1。我不確定為什么會這樣。 我也想為此制作一個JFrame。
import javax.swing.JOptionPane;
public class ProgrammingAssignment7 {
public static void main(String[] args) {
//Scanner Scan = new Scanner (System.in);
//DECLARE VARIABLES
int x = 1;
int i = 1;
int iNumber = 1;
boolean bNotPrime = false;
boolean bIsPrime = true;
int iNumberToTest;
int iPrimeCheck;
int iCounter;
int iResult = 1;
int iFact = 1;
int iLimit = 100;
String OutputStr = null;
System.out.println("Prime numbers between 1 and " + iLimit);
//loop through the numbers one by one
for(i=1; i < 100; i++) {
bIsPrime = true;
//check to see if the number is prime
for(int j = 2; j < i ; j++) {
if(i % j == 0) {
bIsPrime = false;
break;
}
}
}
// print the number
if(bIsPrime) {
OutputStr = "The Prime Numbers of 1 - 100 are: " + i + "\n";
}
JOptionPane.showMessageDialog(null, OutputStr, "PRIME NUMBERS", JOptionPane.INFORMATION_MESSAGE);
//System.out.print(i + "\n" );
System.exit(0);
}
}
您正在for循環中調用system.exit(0)。 這樣它將在第一次迭代后終止程序。 刪除該行,然后嘗試運行程序。 它會給您正確的結果。
除了修復代碼之外,您還應該修復算法。 您正在使用一種稱為“試驗划分”的算法,隨着您的限額增加,該算法將變得緩慢。 相反,您應該使用一種稱為Eratosthenes篩網的算法,該算法是在2000年前發明的,至今仍在廣泛使用。 這是Eratosthenes篩網的簡單版本的偽代碼; 我將它留給您翻譯成Java:
function primes(n)
sieve := makeArray(2..n, True)
for p from 2 to n step 1
if sieve[p]
output p
for i from p * p to n step p
sieve[i] := False
Eratosthenes的算法開始於生成從2到最大所需素數n的數字列表,然后進入迭代階段。 在每個步驟中,都將標識尚未考慮的最小的未交叉數,並從該數的平方開始減去該數的所有倍數; 重復此操作,直到沒有未交叉的數字保持不變為止。 所有未交叉的數字都是質數。 內循環從p * p
開始,因為任何較小的合成物都必須已經被較小的素數消除。
例如,要查找少於30的素數,請首先報告2是素數,並舍去4、6、8、10、12、14、16、18、20、22、24、26和28。 ,因此將其報告為質數,並划掉9、12、15、18、21、24和27。由於已將4划掉,因此下一個未交叉的數字為5,因此將其報告為質數並划掉25。最后,由於7 * 7大於30,因此內部循環停止執行,並且外部循環收集其余的質數:7、11、13、17、19、23和29。
如果您對使用質數編程感興趣,我建議在我的博客上推薦一篇文章 ,該文章除其他外,還提供了Eratosthenes篩網的優化版本。
在內部循環中,迭代到SQRT(N)而不是N就足夠了。它可以稍微減少運行時間。
for(int j = 2; j < Math.sqrt(i) ; j++) {
}
聰明的算法,可以寫出1到100之間的質數(也可以寫成1- [想要多少個-如果您將另一個數字更改為100 )。 質數只能被兩個數整除:1和它本身,因此k必須等於或小於2。
for (int i=1; i<=100; i++) {
int k = 0;
for (int j=1; j<=i; j++ ) {
if (i % j == 0) {
k++;
}
}
if (k <= 2) {
System.out.println(i);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.