嵌套循环和素数
Nested loops and prime numbers
你好,我已经花了很多时间来弄清楚我的教程给出的这个例子是如何工作的,有一些事情我不明白,是的,我已经在网上搜索了帮助,但是当它是这个特定的例子时,我真的想要理解。
我不明白的第一件事是' 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
在内循环中经过从2
到i/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++)
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- 具有动态数组分配的OpenMP嵌套循环
- 两个嵌套循环的运行时间复杂性:二次型还是线性