质数最优程序是什么

时间:2025-01-25 11:55:03 手机游戏

求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)`即可,不需要再检查更大的数。

通过这些优化,程序的时间复杂度得到了显著降低,从而提高了计算质数的效率。