当前位置: 首页 > 知识库问答 >
问题:

埃拉托斯特尼筛子程序的分割故障

子车宏浚
2023-03-14

我正在尝试实现筛选算法,它会询问连续数字列表的大小,并打印出该列表中的素数,但我收到了一个seg错误:11错误。

这是我的代码:

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

#define LIMIT 1000000 /*size of integers array*/

int main(void){
    char n[LIMIT];

    //Reads the size of integer array
    printf("Size of array:\n");
    if((fgets(n, LIMIT, stdin)) == NULL) {
        fprintf(stderr, "Could not read from stdin\n");
        exit(1);
    }

    unsigned long long int i,j;
    int *primes;
    int z = 1;

    primes = malloc(sizeof(n));

    for (i = 2; i < sizeof(n); i++){
    primes[i] = 1; //setting every number in list to 1
    }

    for (i = 2; i < sizeof(n); i++){
        if (primes[i]){
            for (j = i; (i*j) < sizeof(n); j++){
                primes[i * j] = 0; //remove multiples
            }
        } 
    }

    for (i = 2; i < sizeof(n); i++){
        if (primes[i]){
            printf("%dth prime = %llu\n",z++,i);
        }
    }

    free(primes);

    return 0;
}

共有2个答案

詹弘毅
2023-03-14

代码以一种奇怪的方式使用 n。建议简单地扫描整数 n 并使用 n 来结束循环,而不是 sizeof(n)

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

int main(void){
    unsigned long n;

    //Reads the size of integer array
    buffer[30];
    printf("Size of array:\n");
    if((fgets(buffer, sizeof buffer, stdin)) == NULL) {
        fprintf(stderr, "Could not read from stdin\n");
        exit(1);
    }
    if (sscanf(buffer,"%lu", %n) != 1) {
        fprintf(stderr, "Unable to covert to a number\n");
        exit(1);
    }

    unsigned long i,j;
    int *primes;
    // int z = 1;

    primes = malloc(n * sizeof *primes);

    for (i = 2; i < n; i++){
      primes[i] = 1; //setting every number in list to 1
    }

    for (i = 2; i < n; i++){
        if (primes[i]) {
            for (j = i; (i*j) < n; j++){
                primes[i * j] = 0; //remove multiples
            }
        } 
    }

    for (i = 2; i < n; i++){
        if (primes[i]){
            printf("%dth prime = %llu\n",z++,i);
        }
    }

    free(primes);
    return 0;
}
杜绍元
2023-03-14
char n[LIMIT];

LIMIT的值为1000000,这是一个非常大的数组(一百万字节)。它会导致堆栈溢出。您需要为其动态分配内存:

char *n = malloc(LIMIT);
 类似资料:
  • 做一个简单的筛子很容易: 但是当N非常大并且我无法在内存中持有这种数组时,该怎么办?我已经查找了分段筛方法,它们似乎涉及查找素数,直到sqrt(N),但我不明白它是如何工作的。如果 N 非常大(比如 10^18)怎么办?

  • 我正在尝试编写一个程序来实现对埃拉托西的筛选。我可以从2到任何给定的结束编号,但我们正在处理的赋值要求我们输入起始值。我完全被卡住了。我试过很多不同的代码,但它总是给我奇怪的答案。 我的起点是起始值,终点是结束值。我基本上想找到这个范围的素数。谢谢!!!

  • 我的任务如下:使用埃拉托斯特尼筛来定位并打印出从1到1000的所有素数。 遵循与此类似的过程: < li >按顺序写下所有需要考虑的数字。 < li >划掉1,因为它不是质数。 < li >转到未删除的下一个号码;留下它,但是划掉那个数字的所有倍数。 < li >重复步骤3,直到您超过所考虑的最大值的一半。在这一点上,所有没有被划掉的数字都是期望的素数。 您的算法可能与上述算法略有不同,但速度很重

  • 我正在实现一个相当快的质数生成器,我得到了一些不错的结果,在埃拉托斯特尼的筛子上进行了一些优化。特别是,在算法的初步部分,我以这种方式跳过2和3的所有倍数: 这里是一个根据埃拉托色尼筛的布尔数组。我认为这是一种只考虑质数2和3的轮式因式分解,按照模式2、4、2、4递增。. 我想做的是实现一个更大的轮子,也许考虑素数2,3和5。 我已经阅读了很多关于它的文档,但我没有看到任何使用埃拉托斯特尼筛子的实

  • 在一个类作业中,我被要求用Java编写Eratostenes筛选代码,我的代码效率非常低。运行时间不长,但我相当肯定,除了像我一样列出所有内容外,还有其他循环的空间。。 这是我的代码: 基本上,我所做的是将所有不是质数的元素设置为true… 所以我的主要2个问题是1。有没有办法实现一个循环,使代码更短2。如何打印此数组中所有为 true(质数)的元素

  • 我在我的一个班级里做的一个作业,我们必须实现一个厄拉多塞的筛子。我已经尝试了七次来得到一个有效的代码,并且尝试了整合我研究过的许多解决方案。我终于有一个可以输出数字的了。不幸的是,它同时打印合数和质数,但不打印2。 我的代码如下: 我怀疑我的循环有问题。我修复了前两个循环的和变量,以便它从2开始打印出来,问题似乎是在我将数组初始化为true后,它没有将合数标记为。 提前感谢你的帮助。