我已完成此代码,但此代码执行速度非常慢请告诉我如何快速执行时间或编码中的修改是什么 (该程序在任务文本文件中保存500000到10000000之间的素数)
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
public class primenumber {
public static void main(String[] args) throws IOException {
PrintStream as = new PrintStream("task.txt");
int i,j,k;
for(i=500000;i<10000000;i++) //here you can give your own range
{
k=0;
for(j=2;j<i;j++)
{
if(i%j==0)
k++;
}
if(k==0)
as.println(i+" ");
}
as.close();
System.out.println("file is created");
}
}
答案 0 :(得分:2)
我不会告诉你使用更快的算法,你可能会有很多其他(更好解释)的建议。
我会坚持优化你的内在for循环:你可以在知道i
不是素数后立即停止内循环
boolean isPrime = true;
for (j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime)
as.println(i + " ");
答案 1 :(得分:1)
计算素数的方法非常低效。
首先,你不必计算分频器的数量,从有一个分频器的数量,你可以跳过这个数字。
其次,您可以停在 sqrt(n),因为所有超过sqrt(n)的分隔符都有另一个较小的共分频器......
正如@eldjon指出的那样,人们也可以跳过所有偶数(以奇数开头,以2加)。
最后,您不需要枚举所有数字,所有找到的小于 sqrt(n)的素数就足够了。
正如@LuiggiMendoza指出的那样,你确实可以提高将素数写入文件的速度。如果文件不需要是文本的,那么甚至可以更好地编写整数二进制文件(因为转换它们没有计算成本,并且整数将更有效地存储)。
当然有快速素数检查需要log
- 时间(Agrawal, Primes在P 中),但这是一个非常复杂的算法。
建议更快的算法(不考虑旧的素数):
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
public class primenumber {
public static boolean checkDiv (int n) {
int s = (int) Math.sqrt(n)+1;
for(int i = 2; i < s; i++) {
if((n%i) == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) throws IOException {
PrintStream as = new PrintStream("task.txt");
StringBuilder sb = new StringBuilder();
int low = 500000;
int high = 10000000;
for(int i=low|1;i<high;i += 2) {
if(checkDiv(i)) {
sb.append(i+"\n");
}
}
as.println(sb.toString());
as.close();
System.out.println("file is created");
}
}
答案 2 :(得分:1)
更新以下循环以使用sqrt方法:
int jMax = (int) Math.sqrt(i);
for(j=2;j<=jMax;j++)
答案 3 :(得分:1)
我将添加到for
循环(或其他建议的答案)中的一个非常简单的修改是仅通过奇数。我们肯定知道偶数(2除外)不能是素数。所以这会减少50%的迭代次数:
for(int i=500001;i<10000000;i+=2)
然后将结果保存到内存中(例如,存储到数组中)并立即将整个结果列表存储到文件中。单次访问内存比for
循环更有效。