-3

我有一个生成素数的函数。

内部“for-loop”有两个条件检查语句,最终导致内部“for-loop”中断。因此,在内部 for-loop 中断后,控制转移到外部 for-loop,然后再次转移到内部遇到 for 循环,内部 for 循环以 的递增值开始执行k

该值何时增加,而不是在指定条件下中断它的执行if?有人会向我解释这段代码在函数中的工作原理吗?

public void prime()

    {
        int i = 5;

        for (int j = 2; j <= i; j++)
        {
            for (int k = 2; k <= i; k++)
            {
                if (j == k)
                {
                    Console.WriteLine(j);

                    break;
                }
                else if (j % k == 0)
                {
                    break;
                }
            }
        }

    }

输出:

2
3
5
4

3 回答 3

0

这是一种蛮力方法,它2 .. limit针对所有先前的数字(再次, from 2 .. current)测试所有数字,以搜索倍数,如果找到倍数,则该数字不是质数。

我在代码中添加了一些注释以使其更易于理解:

public void prime () {
    int limit = 5;

    /**
     * Starting at 2, assuming the first prime number is 2
     * Test all numbers against any number from 2, if the
     * number being tested is a multiple of some other
     * previous number, that number is NOT a prime
     */
    for (int being_tested = 2; being_tested <= limit; being_tested++) {
        for (int previous_value = 2; previous_value <= limit; previous_value++) {
            /**
             * If previous_value == being_tested then
             * no multiples have been found
             * thus "being_tested" is a prime number
             */
            if (being_tested == previous_value) {
                Console.WriteLine(being_tested);
                break;
            }
            /**
             * If modulus == 0 then "being_tested"
             * is a multiple of previous_value,
             * therefore, not a prime number
             */
            else if (being_tested % previous_value == 0) {
                break;
            }
        }
    }
}

注意:感谢@Cemafor指出,我发布的原始代码已反转条件并且不会按预期运行。

于 2013-06-28T17:00:40.773 回答
0

当遇到中断时,它会跳出内部循环并在循环之后继续。内循环是外循环中唯一的东西,所以执行外循环的下一次迭代。这递增j。当再次执行内部循环时,k将重新设置为2并再次开始循环。k(来自外循环的上一次迭代)的先前值丢失。

该函数本身通过j向上计数来生成素数,然后检查每个小于它的数字(的值k)以查看是否j % k == 0(不是素数,k 是 j 的因数)或j == k(到目前为止没有找到因数,所以 j 必须是素数)。

内部循环本身在技术上循环到i,但是当k到达时j循环被打破,所以只有在也等于时k才会到达。iji

于 2013-06-28T16:50:57.863 回答
0

无论如何,这里有一个详细的演练......k每次都从 2 开始,因为k它是在 for 循环中声明的。第一次运行......j = 2 k =2所以第一个 if 条件得到满足。break 将其返回到外部 for 循环并递增j到 3。j = 3 k = 2... if 都不满足。k 递增...j = 3 k =3满足第一个 if 和 break 的条件。j递增j = 4 k =2…… 第一次通过导致第二个 if 表达式返回 true,因为4 % 2 == 0. 中断内部 for 循环并返回到外部循环。j递增到 5。运行内部循环,直到k递增到 5 并且第一个 if 条件验证为真。第二个 if 条件仅在j为偶数时验证为真,并且将在循环的第一次迭代中这样做

于 2013-06-28T16:50:35.903 回答