我对编码相当陌生,这学期我刚开始学习 Java。我在胡闹并创建了这个 java 程序,它可以找到从 0 到 n 的所有素数。它使用模数和嵌套的 for 循环并将其输出到数组列表中。现在,我用 n = 5、n = 100、n = 1000 和 n = 10000 对其进行了测试,结果完全正常并给了我准确的结果,但是当我输入 n = 100000 时,控制台只是空白,没有给我任何输出。我意识到对于大数字需要更长的时间,所以我期待等待它对所有数字进行处理,但它只是“放弃了”。
这是某些计算超时的结果吗?是否有一个覆盖,所以我可以用更大的数字来计算这个?我意识到这不是最有效的代码(即 for 循环中的计算可能会执行两次),但这不是问题所在。问题是为什么某个数字会停止输出,有没有办法绕过这个。
我把我的代码放在下面,分成两个块,因为我把它放在两个不同的类中。
谢谢:)
通用文件
import java.util.ArrayList;
import java.util.Scanner;
public class General
{
public static void main(String[] args)
{
Scanner number = new Scanner(System.in);
ArrayList<Integer> result = new ArrayList<Integer>();
System.out.print("What is the number you want to find all the primes that are smaller than it: ");
long n = number.nextInt();
PrimeNumberSeeker pNS = new PrimeNumberSeeker();
result = pNS.PrimesFromZero(n);
for (int m = 0; m < result.size(); m++)
{
System.out.print(result.get(m));
if (m+1 >= (result.size()))
System.out.print(".");
else
System.out.print(", ");
}
}
}
PrimeNumberSeeker.java
import java.util.ArrayList;
public class PrimeNumberSeeker
{
ArrayList<Integer> primes = new ArrayList<Integer>();
public ArrayList<Integer> PrimesFromZero(long n)
{
for (int i = 0; i <= n; i++) //selects all numbers from 0 - n inclusive
{
int check = 0;
//System.out.println(i);
for (int j = 1; j <= i; j++) //we make sure not to include 1 and itself (n)
{
if (i % j == 0)
check += 1;
//System.out.println(i + " " + j);
}
if (check == 2)
primes.add(i);
}
return primes;
}
}
这只是一个计算复杂度的问题,您的算法可以在不同方面进行优化以降低其复杂度:
check
变量j
范围限制为2 到 sqrt(i)i%j==0
你能停止你的调查i
:它不是主要的其他建议:
int
s 和long
s,对于你的目的int
s 就足够了这个算法不是最好的,但在处理高达 10.000.000(或更多)的数字时效果很好:
class PrimeNumberSeeker {
public ArrayList<Integer> primesFromZero(int n) {
ArrayList<Integer> primes = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
boolean isPrime = true; // say your number is prime (we'll verify)
for (int j = 2; j <= Math.sqrt(i); j++) { // verify if it really is
if (i % j == 0) {
isPrime = false; // it isn't
break; // no more checks are needed, go out from this for cycle
}
}
if (isPrime) { // if isPrime is still true then i is prime
primes.add(i);
}
}
return primes;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句