【发布时间】:2018-03-02 19:00:29
【问题描述】:
我正在开发一个程序,该程序从用户那里获取一个上限,然后使用一种方法来计算从 1 到 N 的所有素数。我有一个可行的解决方案,但我的脑袋一直在烦我效率太低了。
public ArrayList<Integer> primeNumbers()
{
long startTime = System.nanoTime();
ArrayList<Integer> prime = new ArrayList<Integer>();
ArrayList<Integer> factorList;
for (int i = 2; i <= this.limit; i+=1)
{
factorList = factors(i);
if (factorList.size() == 2 && factorList.contains(1) && factorList.contains(i))
{
prime.add(i);
}
}
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println("The total time was: " + totalTime);
return prime;
}
public ArrayList<Integer> factors(int i)
{
ArrayList<Integer> factor = new ArrayList<Integer>();
for (int a = 1; a <= i; a+=1)
{
for (int b = 1; b<=i; b+=1)
{
if (a*b == i)
{
if (factor.contains(a) == false)
factor.add(a);
if (factor.contains(b) == false)
factor.add(b);
}
}
}
return factor;
}
虽然上面的代码可以运行,但似乎运行起来很慢
this.limit
值高于 3500。关于如何提高效率的任何想法,或者我只是偏执?帮助表示赞赏。
【问题讨论】:
-
你不需要找到所有的因素。您只需要循环 1 - (n/2) 并检查模数。如果 n 模数 loopCounter == 0 则返回 false
-
???????????????????????????????????? O???????????????????? ???????? G????????????????ℎ, ????????????????????????!。这就是你如何知道它是非常低效(~n^2 及以上),还是低效(~n^1.5)。可容忍的筛子运行在 ~n^1.2 左右,擅长 ~n^1.1 及以下。
标签: java performance primes