gpt4 book ai didi

c - 埃拉托色尼筛法——C语言实现

转载 作者:行者123 更新时间:2023-12-02 02:49:17 26 4
gpt4 key购买 nike

我遗漏了一些东西,但我找不到它是什么。我还获得了一个 input2.c 文件,它有一个不允许我更改的 print_prim 函数。

对于 n=10 它总是打印

4, 5, 7, 9, 

我知道print_prim 函数中有一个i+2 但我无法解决它。同样,我不允许更改 print_prim 函数。谁能看到我错过了什么?


main.c


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

int main() {
int n = lese_int();
int laenge = n-1;
int *array;
array = malloc(sizeof(int) * laenge);
for (int i = 2; i <= n; i++) {
array[i] = 1;
}

for(int i=0;i<=n;i++) {
if(array[i] == 1){
for(int j = i ; i*j <= n ; j++){
array[i*j] = 0;
}
}
}
print_prim(array, laenge);
free(array);
return 0;
}

print_prim function

void print_prim(int *array, int laenge) {
for (int i=0; i<laenge; i++) {
if (array[i] == 1) {
printf("%d, ", i+2);
}
}
printf("\n");
}

最佳答案

您所需要的只是一个移动 2 个元素的普通筛子。

int main() {
int n;
scanf("%d", &n);

int *a = (int*)malloc(sizeof(int) * (n - 1));
for (int i = 0; i < n - 1; i++ ) a[i] = 1;

for (int i = 2; i*i <= n; i++) {
if (a[i-2] == 1) {
for (int j = i * i; j <= n; j+=i ) a[j-2] = 0;
}
}

print_prim(a, n - 1);

free(a);
return 0;
}

解释:

  • 分配 n-1 个元素来表示从 2n 的数字。
  • 1 初始化所有元素。为什么?因为查看 print_prim,它打印出等于 1 的值。因此,我们所有的素数都需要移动 2,其值应为 1
  • 从 2 开始,我们将所有质数的倍数标记为 0。留在 1 的是素数。参见 https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes了解详情。
  • 由于 print_prim 移动了 2,我们需要传递 n-1 作为包容性打印的第二个参数。

关于c - 埃拉托色尼筛法——C语言实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52969865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com