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

未打印埃拉托塞恩筛所需的输出

栾峰
2023-03-14

我正在尝试创建一个程序,它输出给定输入值n的素数列表。

我创建的SieveEratosthenes函数:-在前n个整数上生成素数列表-为生成的素数列表创建存储-返回生成的素值的数量。

以下是我的主函数中的代码:

int main(){
    int n, i;
    int *primes;

    printf("Number that needs to be prime factorized: ");
    scanf("%d", &n);

    int num_primes;

    num_primes = SieveEratosthenes(n, &primes);
    printf("Generated a list of %d primes\n", num_primes);
    printf("\n");

    for (i = 0; i <= sizeof(num_primes) + 1; i++){
        printf("%d", *primes++);
    }
   printf("\n");

   return 0;
}

假设n=20;我的输出是:

生成8个素数的列表

2 3 5 7 11 13'

我想要的输出应该是“2 3 5 7 11 13 17 19”

我的筛选函数工作正常,但我无法在主函数中打印出整个素数列表。

任何帮助将不胜感激。谢谢!

共有1个答案

燕英逸
2023-03-14

您无法通过计算sizeof(num_primes)来确定素数:这是一个编译时间常数,它不会随着您输入的值而改变。看起来您的系统对int使用了四个字节,因此从0到sizeof1(包括0和1)的迭代涵盖了索引0、1、2、3、4和5,这与您观察到的打印六个数字的情况一致。

如果SieveEratostenes返回它找到的素数,循环应该从零迭代到该数,而不是sizeof(num_primes):

for (i = 0; i != num_primes ; i++){
    printf("%d", primes[i]);
}

请注意,我将 *素数更改为素数 [i]。这是为了帮助您在完成后释放素数,并避免内存泄漏。

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

  • 就像这个问题一样,我也在厄拉多塞的筛子上工作。同样来自《c语言编程原理和实践》一书的第4章。我能够正确地实现它,并且它的功能完全符合练习的要求。 现在,我怎样才能在输入的中处理真正的大数字?类型应该允许我输入2^32=4,294,967,296的数字。但是我不能,我运行内存溢出。是的,我已经计算过了:存储2^32量的int,每个32位。所以32/8*2^32=16 GiB的内存。我只有4 GiB…

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

  • 我正在尝试让我的埃拉托斯特尼筛程序仅输出用户请求的前n个素数。Sieve本身工作得很好 - 它正确地输出了前100个素数(如下面的数组所示),但是最后一个循环中的计数器变量无法正常工作,我无法找出原因。例如,如果用户输入“5”表示 n,则只会打印前 3 个定焦值。 有人可以帮我找出我的错误吗?我的目的是让“count”成为一个非常简单的计数器,每次都会增加1,直到它达到n。

  • 我正在尝试对厄拉多塞的筛子进行并行实现。我做了一个布尔列表,对于给定的大小,用true填充。无论何时发现一个素数,该素数的所有倍数在布尔列表中都被标记为假。 我试图使这个算法并行的方法是在仍然过滤初始质数的同时启动一个新线程。例如,算法从素数 = 2 开始。在 for 循环中,当素数 * 素数时,我做另一个 for 循环,其中检查素数 (2) 和素数 * 素数 (4) 之间的每个数字。如果布尔列表

  • 我试图找到素数使用厄拉多塞筛位数组,但我使用的是无符号整数数组。我需要能够产生多达2,147,483,647个素数。我的代码工作正常,可以生成大约10,000,000个,但是当我增加数组的大小以容纳更大的数字时,它失败了。有人能指导我如何用c语言(不是c语言)使用位向量吗?谢谢 这是我的代码: