#include <stdio.h>
#define MAXNUMB 100
int main (void)
{
int i,j;
for (i=11 ; i<MAXNUMB; i+=2)
{
for (j=3;j*j<=i;j+=2)
{
if (i%j==0)
{
break;
}
}
if (j*j>i)
printf(''%d is prime\n'',i);
}
}`
所以我有3个问题
"i=11"
,因为我们只需要两个数字素数,但为什么j=3
而不是j=11
"j*j<=i;
他为什么这样做?我们获得了什么?if (j*j>i)
而不是(j==i)
答案 0 :(得分:2)
为什么
j=3
而不是j=11
因为j
是您的候选人 divisor 。您需要尝试除2
之外的所有除数,除了11
,已经通过构造算法消除了(您从2
开始向上移动2
,所以您只看到奇数数字;无需通过j*j<=i;
)检查可分性。
第8行
(j*j>i)
他为什么这样做?我们获得了什么?
如果你尝试了所有数字,包括候选素数的平方根,并且没有找到除数,那么在平方根上面也不会有除数。这为您节省了大量不必要的迭代。
为什么我们如果
那么这样做(j==i)
而不是break
循环在以下两个条件下终止:(a)您到达j
,或(b)i
超过break
的平方根。如果你到达asset pipeline
,就意味着你找到了一个除数;如果你超过平方根,你就没有了。
答案 1 :(得分:0)
首先,它背后的理论:
如果中没有
之类的其他因素
,则
在您的代码中,您遵循相同的路径。内循环尝试所有可能的小于或等于
。
我们使用
"i=11"
,因为我们只需要两个数字素数,但为什么j=3
而不是j=11
根据我刚才所说的,你应该问为什么!不是
?答案很简单!
j
是i
中的一个因素(例如,3 = 12 = 3 * 2 * 2中的因子)在此代码中,为了使其更快,您只是跳过所有偶数({{1} }),那么你不需要j = 2来检查'i'是否可以被j分割。
第8行
i+=2
他为什么这样做?我们获得了什么?为什么我们有这个
"j*j<=i"
而不是if (j*j>i)
答案 2 :(得分:0)
试验分部定理:
检查给定整数n的素数的最基本方法称为试验除法。该例程包括将n除以每个整数m,该整数m大于1且小于或等于n的平方根。
因此,让我们检查37的素数。
floor(sqrt(37)) = 6
因此,从2到6检查,天气37可被任何数字整除。如果37不能被任何数字整除,则数字为素数。
所以,在你的例子中:
floor(sqrt(11)) = 3 that's why started j = 3,
此外,我们没有在i上执行sqrt,而是考虑了j的平方,即j * j&lt; = i;
而且,对于@dasblinkenlight的最后一个问题答案是最好的。
答案 3 :(得分:0)
我们使用&#34; i = 11&#34;因为我们只想要两个数字素数,但为什么j = 3而不是j = 11
i
是要检查它是否为素数的数字(因为您最初只需要2位数字i=11
)并且您的代码通过检查{{的可分性来执行此操作1}}与i
。因此,j
应该从2开始,但由于您的代码忽略了由j
引起的所有偶数(最初为i+=2
,因此由于i=11
循环增加,我们的值为{{1因此,无需检查i+=2
与2的可分性。因此i=11, 13, 15,.. only odd numbers
的初始值为3。
第8行&#34; j * j&lt; = i;为什么他这样做?我们获得了什么?
也可以写成i
。假设j
如果j<=sqrt(i)
可以被i=N^2
整除,那么N
也可以被j
整除。因此,我们不会检查N^2
与j
到i or N^2
的可分性,而是将其限制为j
,这会减少可分性检查的操作次数,从而减少程序的执行时间
假设j<i or j<N^2
然后j<=sqrt(i) or j<=N
评估i=21
(注意j是j=sqrt(i)
值,因此j to be 4
结果为4而不是int
值sqrt(21)
)。因此,程序将检查float
与4.58
的可分性,即j = 3(初始值)和4(4 <= sqrt(21))而不是i=21
,即j = 3(初始值),4,5,... 20(20 <21),这导致程序禁食。
我们也可以使用j<=sqrt(i)
但是在j<i
的极高值(例如&gt; 10 ^ 6)之后会更好,并且不适用于较小的值。
为什么我们有这个if(j * j&gt; i)而不是某些东西(j == i)
这是因为前一点。
我们将j<=pow(i,(1/3 or 1/4 or 1/n))
限制为i
,而不是检查i or N^2
与j
的可分性,而是将其限制为j<=i or j<=N^2
,这会减少可分性检查的操作次数,从而减少执行时间计划。
因此,如果可分性检查超过值j<=sqrt(i) or j<=N
而没有余数等于0或j*j>i or j>sqrt(i)
为假,那么i%j==0
被证明是素数并被打印。