嵌套循环和素数

Nested loops and prime numbers

本文关键字:嵌套循环      更新时间:2023-10-16

你好,我已经花了很多时间来弄清楚我的教程给出的这个例子是如何工作的,有一些事情我不明白,是的,我已经在网上搜索了帮助,但是当它是这个特定的例子时,我真的想要理解。

我不明白的第一件事是' I '和'j' = 2,两个for循环都有i++和j++,这不会使' I '和'j'一直相等吗?所以在第二个for循环中,如果'j'必须小于e.g.…4/4 = 1那么它一定小于1?当它初始化为2时。

int i, j;
for(i=2; i<100; i++)
{
    for(j=2; j <= (i/j); j++)
    {
    if(!(i%j))
        break; // if factor found, not prime
    if(j > (i/j))
        cout << i << " is primen";
    }
}

两个for循环都有i++和j++,这不会使'i'和'j'始终相等吗?

不!i++增加外部循环,j++增加内部循环。对于外部循环的每一轮,内部循环可以迭代(并因此增加)几次。因此,对于每一轮外循环,j在内循环中经过从2i/j的值。

我建议您在调试器中尝试这段代码,或者在纸和笔上模拟它,以了解发生了什么。

j上的for循环将对i的每个值执行完整的范围,所以不,它们并不总是相等的。

是的,当i的值很低时,j上的循环甚至不会开始,但是随着i的值越来越大,j上的循环会为每一个i的值运行更长的时间。

仅以i == 81为例。然后j将取[2..9]范围内的值

代码正在搜索2和99之间的所有素数,因此i和j初始化为2。*

理解,第一个for循环尝试2和99之间的每个数是否为素数,使用第二个for循环搜索i的除数。

如果第二个for循环没有找到除数,则i是素数。

两个嵌套循环没有相同的值,因为它们是嵌套的!所以当i =2, j=2,那么j=3(i还是2),那么j=4,(i还是2)........然后j=99,因此第二个循环结束,然后也是第一个for循环增量:i=3, j=2,然后j=3(i仍然是3) .....希望我已经说清楚了:)有疑问就问吧!

由于j的上限,看起来现有代码实际上不会将i声明为素数。声明i为素数的cout语句在j > (i/j)时触发,但j只被增加到(i/j)(它目前永远不会大于(i/j),即使i是素数)。

尝试将内循环调整为:

for (j = 2; j <= ceilf(float(i)/float(j)) + 1; j++)