for
循环:
for(j = 2; j <= (i/j); j++)
在j <= (i/j)
时第一次没有通过i = 2
。
并且:
if(j > (i/j)) cout << i << " is prime\n";
不属于该for
循环的一部分。
,
如果我们这样重写您的代码:
for (i = 2; i < 20; i++)
{
for (j = 2; j <= (i / j); j++)
{
if (i % j == 0) break;
}
if (j > (i / j)) cout << i << " is prime\n";
}
那么,更清楚的是break
仅会跳出内循环,然后下一行(显示2)将随后执行。
,
在2到n / 2之间的因数,以检查是否为质数
#include <iostream>
using namespace std;
int main () {
int i,j;
for(i = 2; i<20; i++)
{
for(j = 2; j <= (i/2); j++)
if(i%j==0) break;
if(j > (i/2)) cout << i << " is prime\n";
}
return 0;
}
,
之所以打印2
,是因为当i=2
,j=2
时,内循环的条件会失败(2 > 2/2
)。
关于此代码的另一个有趣的事实是为什么,您只能上i/j
来查找素数。这是因为复合数的素数不大于其平方根(demonstration)。
因此,基本上j
仅上升2
到sqrt(i)
。
如果将for
的条件从j <= i/j
更改为j*j <= i
,也可以清除代码。为什么?因为i/j
是整数除法,所以您需要额外的条件if(j > (i/j))
。所以最终的代码将是:
#include <iostream>
using namespace std;
int main () {
int i,j;
for(i = 2; i<20; i++)
{
for(j = 2; j*j <= i; j++)
if(i%j==0) break;
cout << i << " is prime\n";
}
return 0;
}
本文链接:https://www.f2er.com/3072848.html