[英]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.