你好我现在花了很多时间试图弄清楚我的教程给出的这个例子是如何起作用的,还有一些我不理解的东西,是的,我在网上寻求帮助,但没有在这个具体的例子中,我真的很想了解。
我不明白的第一件事就是'我'和' 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";
}
}
答案 0 :(得分:4)
两个for循环都有i ++和j ++,不会让'i'和'j'一直相等吗?
都能跟得上! i++
递增外部循环,j++
递增内部循环。对于外循环的每一轮,内循环可以迭代(并因此递增)若干次。因此,对于外循环的每一轮,j
都会遍历内循环中2
到i/j
的值。
我建议您在调试器中尝试使用此代码,或者在笔和纸上模拟它以了解正在发生的事情。
答案 1 :(得分:1)
j上的for
循环将为i的每个值执行全范围。所以不,他们不会总是平等的。
是的,当i的值很低时,j上的循环甚至不会启动,但随着i逐渐变高,j上的循环对于i的每个值都会运行一段时间。< / p>
例如,考虑案例i == 81
。然后j将采用[2..9]
答案 2 :(得分:0)
代码正在搜索 2和99 之间的所有素数,因此i和j初始化为2。*
理解第一个for循环尝试 2和99 之间的每个数字是素数,使用第二个for循环,它搜索i的除数。
如果第二个for循环没有找到除数,那么我就是素数。
两个嵌套循环没有相同的值,因为它们是嵌套的!所以当 i = 2,j = 2,然后j = 3(我仍然是2),然后j = 4,(我仍然是2) ........然后j = 99,所以第二个循环结束,然后第一个循环增量: i = 3,j = 2,然后j = 3(我仍然是3) .....希望我一直很清楚:)要求怀疑!
答案 3 :(得分:0)
由于i
的上限,现有代码实际上并不会将j
声明为素数。声明i为主要触发器的cout
语句在j > (i/j)
时触发,但j
仅增加到(i/j)
(目前它永远不会大于(i/j)
,即使i
是素数)。
尝试将内循环调整为:
for (j = 2; j <= ceilf(float(i)/float(j)) + 1; j++)
或类似的东西。