求100000以内的质数个数最优程序如下:
```java
public class PrimeNumberTest {
public static void main(String[] args) {
long start = System.currentTimeMillis(); // 获取当前时间的毫秒数
boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值
int count = 0; // 记录质数的个数
for (int i = 2; i <= 100000; i++) {
// 优化二:对本身是质数的自然数是有效的。
// for (int j = 2; j < i; j++) { // j:被i去除
for (int j = 2; j <= Math.sqrt(i); j++) { // j:被i去除
if (i % j == 0) {
isFlag = false;
break; // 优化一:只对本身非质数的自然数是有效的。
}
}
if (isFlag) {
count++;
}
// 优化三:如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。
// 因此,如果i不是质数,那么i一定有一个因子j,且j <= sqrt(i)
// 所以,我们只需要检查到sqrt(i)即可,不需要再检查更大的数。
}
long end = System.currentTimeMillis(); // 计算结束时间
System.out.println("质数数量count: " + count);
System.out.println("开始到结束的时间差: " + (end - start) + "ms");
}
}
```
解释
优化一:
只对本身非质数的自然数是有效的。如果`i`是质数,那么它不会被任何数整除,因此不需要进行进一步的检查。
优化二:
对本身是质数的自然数是有效的。如果`i`是质数,那么它不会被任何数整除,因此不需要进行进一步的检查。
优化三:
如果一个数是合数,那么它的最小质因数肯定小于等于它的平方根。因此,如果`i`不是质数,那么它一定有一个因子`j`,且`j <= sqrt(i)`。我们只需要检查到`sqrt(i)`即可,不需要再检查更大的数。
通过这些优化,程序的时间复杂度得到了显著降低,从而提高了计算质数的效率。