【问题标题】:Sieve of Eratosthenes algorithm using arrays in C使用 C 中的数组筛选 Eratosthenes 算法
【发布时间】:2013-07-18 12:22:43
【问题描述】:

我必须遵循埃拉托色尼算法的筛法,即:

初始化数组 is_prime 以便所有元素的值都为真。然后,将 is_prime[1] 的值设置为 false(因为 1 不是素数。) 对于 I=2 直到 sqrt(N) 将 I 的所有倍数设置为 false,从 I*I 开始直到 N。 最后,打印 is_prime 中所有保持值为 true 的索引。

问题是它可以编译,但它不打印任何东西。您不提供输入,它应该显示 1-300 之间的所有素数。

这是我目前开发的代码:

#include <stdio.h>        //Library functions
#include <math.h>
#include "simpio.h"

#define N 300             //defining constant

void displayPrime(bool checkPrime);         //Function prototypes
bool checkPrime (int I);
bool is_prime[N+1];          //Array decleration

main()                    
{        
         displayPrime(is_prime);

         getchar();      
}

void displayPrime (bool check)          //Function definitions
{
         int I;

         for(I=1; I<N; I++)
         {
                  checkPrime(I);
                  if(is_prime[I]==false)
                  {
                          printf("");
                  }
                  else if(is_prime[I]==true)
                  {
                          printf("%d\n", I);
                  }
         }
}

bool checkPrime (void)
{
         int number1, x;
         double number;

         is_prime[1]=false;

         number=sqrt(N);
         for(number1=2; number1<=number; number1++)
         {
                  for(x=number1; x<=N; x=x+number1)
                  {
                         is_prime[x]=false;
                         return(is_prime[x]);    
                  }        
                  is_prime[number1]=true;                  
                  return(is_prime[number1]);
         }                      
}

谢谢你:D

【问题讨论】:

  • 您发布的代码有什么问题?它不编译吗?它会运行但会产生令人惊讶的结果吗?对于后者,你给出了什么样的意见,你期望得到什么样的结果,得到什么样的结果?
  • 可以使用 sieve 首先运行一个函数,该函数将用 0 或 1 填充数组(如果 i 不是素数,则第 i 个单元格为 0,否则为 1)然后遍历它们并print 而不是每次都调用checkPrime()。我建议检查wikipedia 的理论和this link 的视觉理解
  • 我在我的博客上的 essayProgramming with Prime Numbers 中讨论了这个算法,包括 C 代码。
  • 不,它编译,但它不打印任何东西。您不提供输入,它应该显示 1-300 之间的所有素数。
  • between 1-300 怀疑。 for(I=1; I&lt;N; I++) { checkPrime(I);

标签: c arrays algorithm math sieve-of-eratosthenes


【解决方案1】:

你说程序不打印任何东西?在我看来这将是一个无限循环。

考虑完成所有工作的循环:

     number=sqrt(N);
     for(number1=2; number1<=number; number1++)
     {
          // This looks like an infinite loop!
          for(I=number1; I<=N/I; I=I*number1)
          {
              I=false;    
          }        
          if(I==false)
          {
              is_prime[I]=false;  
          }
          else
          {
              is_prime[I]=true;
          }                  
          return(is_prime[I]);
     }

内部循环无法终止。假设您使用 I=2 调用该函数。第一次进入该循环时,I 被设置为 false(即 0)。然后再次检查条件(I&lt;=N/I)...等等,这不是给你一个除以 0 的错误吗?

您程序中的逻辑有点混乱。您应该将程序分成两部分:计算素数,然后显示素数。从结构上看,它应该是这样的:

bool is_prime[N+1]

main()
{
    // fill is_prime with true

    // and then compute the primes
    computePrimes()

    // now output primes
    for (int i = 1; i <= N; i++)
    {
        if (is_prime[i])
            printf(....);
    }
}

除此之外,您必须编写computePrimes 方法。您对外循环有基本的想法,但内循环的逻辑是不正确的。考虑一下如果你的循环看起来像这样会发生什么:

for (int number1 = 2; number1 <= sqrt(N); number1++)
{
    for (int x = number1*2; x <= N; x = x + number1)
    {
        is_prime[x] = false;
    }
}

有一个优化机会,我特意没有包括在内,您可以稍后添加。不会影响结果,只会影响速度。

【讨论】:

  • 但是内部循环不符合算法
  • 我的以下循环似乎不起作用: for(number1=2; number1
  • 你能看懂吗,我才意识到它真的很乱。如果太乱我更新了原始代码
  • @MichaelFerashireSilva:将第二个循环初始化更改为:int x = number1*2。不要return 循环中的任何内容。这个函数所做的就是填充数组。 main 中的循环在计算完素数后打印它们。
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多