【问题标题】:Nested loops and prime numbers嵌套循环和素数
【发布时间】:2014-09-19 15:21:41
【问题描述】:

您好,我现在花了很多时间试图弄清楚我的教程给出的这个例子是如何工作的,有一些我不明白的事情,是的,我已经在网上搜索了帮助,但是当我真正想了解的是这个具体的例子。

我不明白的第一件事是'i'和'j' = 2,并且for循环都有i++和j++,这不会让'i'和'j'一直相等吗? 所以在第二个for循环中,如果'j'必须小于例如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 prime\n";
    }
}

【问题讨论】:

  • 请把大括号放在你所有的循环中。
  • 添加“cout

标签: c++ loops for-loop nested primes


【解决方案1】:

for 循环都有 i++ 和 j++,那不是让 'i' 和 'j' 一直相等吗?

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

我建议您在调试器中试用此代码,或在笔和纸上对其进行模拟以了解发生了什么。

【讨论】:

  • 所以 j 变得大于 i?
  • @Jacob,不,它没有超出等于i/j 的点。
  • 好吧,我现在很困惑,我不知道 i 和 j 何时增加以及增加多少。
  • @Jacob,在各自循环的每次迭代(“回合”)结束时,每次迭代一次。
  • 所以第 1 轮,'j' 和 'i' 都将是 2?并且第 2 轮“j”和“i”将是 3,如果它们每次递增 1?
【解决方案2】:

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

是的,当 i 的值较低时,j 上的循环甚至不会开始,但是随着 i 逐渐取更高的值,j 上的循环将针对 i 的每个值运行更长的时间。

例如,想想i == 81 的情况。然后 j 将采用 [2..9] 范围内的值

【讨论】:

  • 所以j在找到一个可以与i等分的数时停止运行?
  • 正如所写,只要 i 被 j 整除,j 循环就会中断(并因此停止执行)。这可能不是你真正想要发生的事情。
【解决方案3】:

代码是搜索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, then j=3(i is still 3) ..... 希望 i '''ve been clear :) 提出疑问!

【讨论】:

  • 但是素数只能被 1 整除,否则为什么 'i' 会是 2?
  • 2 是质数,1 不是。
  • 但是你说的是'j'会先从2跑到99,然后'i'会,然后'i'会从2跑到99?我真的很困惑嘿嘿
  • 对于 i 的每个值(2 到 99 之间),j 将假定 2 到 i/j 之间的每个值。所以当 i = 2, j = 2, 然后 j = 3, j=4 ecc...为了让你的代码更清晰,你可以写 for(j=2;j,即 j 从 2 到 i 的平方根。
【解决方案4】:

看起来现有代码实际上不会将i 声明为素数,因为j 的上限。当j &gt; (i/j),但j 仅递增到(i/j) 时,声明i 为素数的cout 语句将触发(即使i 是素数,它目前永远不会大于(i/j))。

尝试将内循环调整为:

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

或类似的东西。

【讨论】:

  • 谢谢@JasonMArcher,我忘了正确格式化代码
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2015-07-17
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多