质数又称素数,除了1和它本身以外不再有其他因数。
这里用java语言,普通算法,直接硬求也是没问题的
import java.util.Date;
import java.lang.Math;
public class Test {
public static void main(String[] args) {
int j, n = 0;
long startTime = System.currentTimeMillis();
for (int i = 2; i <= 100000; i++) // 1不是素数,所以直接从2开始循环
{
j = 2;
while (i % j != 0) {
j++; // 测试2至i的数字是否能被i整除,如不能就自加
}
if (j == i) // 当有被整除的数字时,判断它是不是自身
{
n++;
System.out.println(i); // 如果是就打印出数字
}
}
long endTime = System.currentTimeMillis();
long timeLong = endTime - startTime;
System.out.println("一共有 " + n + " 个质数。");
System.out.println("编译所花时间:" + timeLong);
}
}
最终运行结果为:
2
3
5
......
99991
一共有 9592 个质数。
编译所花时间:1563
有一个定理:用一个数分别去除2到sqrt(这个数的平方根),如果能被整除, 则表明此数不是素数,反之是素数。
所以我们重新按照这个算法来求10万以内的质数。
import java.util.Date;
import java.lang.Math;
public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int n = 0;
d: for (int i = 2; i <= 100000; i++) {
// 每一个数一个个接受检验是否为素数
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
// 这个就能直接判断是否有因数,如果有直接跳出该循环,判断下一个i
continue d;
}
}
n++; //计数器+1
System.out.println(i); // 输出质数
}
long endTime = System.currentTimeMillis();
long timeLong = endTime - startTime;
System.out.println("一共有 " + n + " 个质数。");
System.out.println("编译所花时间:" + timeLong);
}
}
2
3
5
......
99991
一共有 9592 个质数。
编译所花时间:95
很明显,编译时间缩短了不止一点点