C

时间:2015-11-20 02:56:50

标签: c

好吧,我有一个非常简单的问题。我们必须找到所有至少有2位数的素数(11是第一个素数)。我们必须定义maxnumb。教授做了什么。

#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个问题

  1. 我们使用"i=11",因为我们只需要两个数字素数,但为什么j=3而不是j=11
  2. 第8行"j*j<=i;他为什么这样做?我们获得了什么?
  3. 为什么我们有这个if (j*j>i)而不是(j==i)

4 个答案:

答案 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)

首先,它背后的理论:

  如果P中没有j之类的其他因素P,则

2 < j < strq(P)是素数。

在您的代码中,您遵循相同的路径。内循环尝试所有可能的j小于或等于sqrt(i)

  

我们使用"i=11",因为我们只需要两个数字素数,但为什么j=3而不是j=11

根据我刚才所说的,你应该问为什么3<j!不是2<j?答案很简单! ji中的一个因素(例如,3 = 12 = 3 * 2 * 2中的因子)在此代码中,为了使其更快,您只是跳过所有偶数({{1} }),那么你不需要j = 2来检查'i'是否可以被j分割。

  

第8行i+=2他为什么这样做?我们获得了什么?

     

为什么我们有这个"j*j<=i"而不是if (j*j>i)

这两个问题都与这部分有关:3<j

答案 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^2ji 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而不是intsqrt(21))。因此,程序将检查float4.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^2j的可分性,而是将其限制为j<=i or j<=N^2,这会减少可分性检查的操作次数,从而减少执行时间计划。

因此,如果可分性检查超过值j<=sqrt(i) or j<=N而没有余数等于0或j*j>i or j>sqrt(i)为假,那么i%j==0被证明是素数并被打印。