我有一个计算前 200 个素数的程序,但我不明白其中的公式

I have a program that calculates the first 200 prime numbers, but I do not understand a formula in it

我需要写一个代码来计算前200个质数,但我不能交,因为我无法解释所有的事情。我使用了一段来自互联网的代码作为参考(http://crab.rutgers.edu/~dhong/cs325/chapter3/PrimeNumber.java)。

完整代码:

public class Opdracht3 {
    public static void main(String[] args) {
        int limiet = 200;
        int counter = 1;
        int testpriem = 3;
        boolean isPriem;

        while (counter <= limiet) {
            isPriem = true;
            for (int i = 2; i <= testpriem / 2; i++) {
                if (testpriem % i == 0) {
                    isPriem = false;
                    break;
                }
            }
            if (isPriem) {
                System.out.println(counter + ": " + testpriem);
                counter++;
            }
            testpriem++;
        }
    }
}

下面的部分代码验证数字是否为合数。如果 testpriem 是复合的,则退出循环并重新开始。否则,它将继续并打印素数 testpriem.

问题出在这里:

for (int i = 2; i <= testpriem / 2; i++) {
   if (testpriem % i == 0) {
      isPriem = false;
      break;
   }
}

我测试了 i 发生的情况,它以某种方式识别了计算合成所需的除数。 (4 个除数是 2,9 个除数是 3,221 个除数是 13)但我很惊讶为什么。

有什么想法吗?

Java 中的 % or ("remainder") operator 将一个操作数除以另一个操作数,returns 余数作为结果。当然,如果整数 x 可以被另一个整数 y 整除(意思是 x/y = 某个整数 z 余数为零),那么 x 不能成为素数。

首先记住所有能除以其一半或更少的数字。考虑数字 7 可能除以 1、2、3,因为在 3 之后,如果尝试将数字除以 4 意味着 4x2 = 8 大于 7。因此以这种方式找到除数是最佳方法。每个数字除以 1 和数字本身还有一件事。所以如果 number number 除以 1 或它本身,那么它被称为质数,所以我从 2 开始。

现在考虑 testpriem =7 这样你就会得到类似

的循环
for (int i = 2; i <= 7 / 2(i.e 3); i++)
    {
            if(7 % i == 0)
            {
                isPriem = false; 
                break;
            }

所以它第一次检查 7%2=1 所以条件为假。再次检查 7%3 = 1 条件是否为假。现在这个条件完全满足这里 i <= 7 / 2(即 3) 所以循环停止并且结果 7 数字是质数

嗯,如果testpriem % i == 0,就是说i整除testpriem,也就是说testpriem不是素数而i是它的第一个除数. % 是模运算,也就是除法的其余部分。

https://en.wikipedia.org/wiki/Modulo_operation

break 停止for 循环并移动到while 循环中的下一个位置。所以它不会为当前测试的数字重新启动 for 循环。

中断是出于效率考虑。您可以删除它,算法仍然可以正常工作,但速度较慢。