为什么j需要小于或等于sqrt(i)? 我需要编写一个C++程序来找到范围内的素数。但是我不知道这个代码的意思:jnum1; cout>num2; 对于(inti=num1;i

为什么j需要小于或等于sqrt(i)? 我需要编写一个C++程序来找到范围内的素数。但是我不知道这个代码的意思:jnum1; cout>num2; 对于(inti=num1;i,c++,C++,让我们假设您想要检查数字25是否为素数 如果你写得像 for ( int j = 2; j < sqrt( 25 ); j++ ) { //... } 显然,对于大于sqrt(25)的数字,将有一个余数。因此,对于大于sqrt(25)的除数,继续循环没有意义 请注意循环效率低下。您可以首先检查给定的数字是否为偶数且不等于2。在这种情况下,显然该数字不是质数 如果数字不是偶数,则可以应用如下循环 for ( int j = 3; j <= num / j; j += 2 )

让我们假设您想要检查数字
25
是否为素数

如果你写得像

for ( int j = 2; j < sqrt( 25 ); j++ )
{
    //...
}
显然,对于大于
sqrt(25)
的数字,将有一个余数。因此,对于大于
sqrt(25)
的除数,继续循环没有意义

请注意循环效率低下。您可以首先检查给定的数字是否为偶数且不等于2。在这种情况下,显然该数字不是质数

如果数字不是偶数,则可以应用如下循环

for ( int j = 3; j <= num / j; j += 2 )

for(int j=3;j让我们假设你有数字100,你需要知道它是否是素数。如果这个数字只能在1和自身上被除,那么它就是素数。因此如果我们有100,那么每一个大于
sqrt(100)
(例如10)的数字都可以被除,那么结果将在1到10之间(
sqrt(100)
)。由于您不需要找到数字的所有除数,而只需要找到除1和数字之外的一个除数(这样您就可以知道数字是否为素数),因此您可以从2循环到
sqrt(数字)

考虑一个复合数的属性可能更好——它至少有一个因子,而不是它本身和
1
。对于每个小于或等于
sqrt(i)
的因子,都会有另一个大于或等于
sqrt(i)的因子
,反之亦然。如果没有发现小于或等于
sqrt(i)
,就不可能有大于或等于
sqrt(i)
(如果
sqrt(i)
i
的因子,这是因为它可以自身相乘得到
i
)。
for ( int j = 2; j <= sqrt( 25 ); j++ )
                   ^^
{
    //...
}
for ( int j = 3; j <= num / j; j += 2 )