【问题标题】:Sieve of Eratosthenes, Prime Numbers C [closed]埃拉托色尼筛,素数 C [关闭]
【发布时间】:2017-04-04 20:30:47
【问题描述】:

我正在编写一个程序来查找直到 1000 的素数,使用 Eratosthenes 筛......但它不起作用......这是我的整个代码,但是“计算”找到素数在函数“markPrimes”内(我有信心说其余的代码没问题,所以我很确定问题出在这个函数中......

#include <stdio.h>
#include <stdlib.h>

typedef struct primal
{
    int number; /* a number */
    char mark;  /* flag marking the number as active (1) or inactive (0) */
} primal;


void initialize(primal *s,int size)
{
    int i;
    for(i=0;i<1000;i++)
    {
        s[i].number=i+1;
        s[i].mark=1; //1=prime number 
    }
}

void markPrimes(primal *s,int size)
{
    /* add this function - it should mark all of the numbers in the passed primal array that are not prime numbers as inactive */
    //Brute Sieve of Eratosthenes Approach (0=not prime number)

    s[0].mark=0; //s[0].number=1 as on the function "initialize" I start from 1 not from 0
    int i,j;
    for (unsigned i = 2; i*i <size; i++)
    {
        if (s[i].mark == 1)
            for (unsigned j = i<<1;j<size;j+=i)
                s[j].mark = 0;
    }
}

int main(void)
{
    int i,j,prime_numbers[200];
    primal source_numbers[1000]; /* an array of source values */

    for(i=0;i<200;i++) prime_numbers[i]=0; /* initialize the prime numbers array to 0 */

    initialize(source_numbers,1000); /* initialize the source numbers array to hold the numbers 1-1000 */

    markPrimes(source_numbers,1000); /* identify the prime numbers in the source numbers array */

    /* copy the primes from the source numbers to the prime numbers array */
    for(i=0,j=0;i<1000;i++)
    {
        if(source_numbers[i].mark==1) /* if the current source number is a prime */
        {
            prime_numbers[j]=source_numbers[i].number; /* copy the number */
            j++; /* increment the target index */
        }
    }

    /* print the prime numbers */
    for(i=0,j=0;prime_numbers[i]!=0;i++,j++)
    {
        printf("%3d ",prime_numbers[i]);
        if(j==9) /* periodically print a newline and then reset j */
        {
            printf("\n");
            j=-1;
        }
    }
    return 0;
}

【问题讨论】:

  • 请更具体。你所说的“它不起作用”是什么意思?你的问题到底是什么?见How to create a Minimal, Complete, and Verifiable example
  • 您可以通过不使用结构而使用charbool 的简单数组来简化事情。通过检查数组的元素 N 可以找到 N 的素数。您可以将 0 和 1 保留在数组中,因为删除它们比较困难,而且浪费的空间可以忽略不计。

标签: c math numbers primes


【解决方案1】:

众所周知,C 允许程序员在他们的脚上标点(别担心,我们每个人都有这样的伤疤),这就是这里发生的事情。

在您的内部循环中,您从 1 而不是 0 开始,因此您需要将实际数字减一作为索引并添加该数字而不是索引:

void markPrimes(primal *s,int size)
{
    //Brute Sieve of Eratosthenes Approach (0=not prime number)

    int i,j;
    // 1 (one) is not prime per definition
    s[0].mark = 0;
    for (i = 1; i*i <size; i++)
    {;
        if (s[i].mark == 1) {
            // you start at 1 instead of 0, so you need to take the actual number
            // minus one as the index and add that number instead of the index.
            for ( j = 2 * s[i].number  - 1;j < size; j += s[i].number){
                s[j].mark = 0;
            }
        }
    }
}

【讨论】:

  • 谢谢它现在完全可以工作了^^
【解决方案2】:

埃拉托色尼筛法的起点问题。

for (无符号 i = 1; i*i

这个循环应该从 2 而不是 1 开始。您基本上所做的是将所有数字标记为最初的非质数。

相反,通过执行 s[0].mark=0; 手动将 0 和 1 标记为非素数; s[1].mark=1。然后从 i=2 开始循环

【讨论】:

  • 我改变了你所说的从 2 开始 for 循环,而不是从 1...另外我初始化了 s[0].mark=0(我没有数字 0,因为我开始从数字 1 而不是从 0 填充数组,并且我初始化了 1 .mark=0[1 不是素数,所以我不明白为什么我应该将它初始化为 1])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2016-10-29
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多