不打印所需的输出用于eratosthene筛

时间:2014-03-10 21:37:48

标签: c printf sieve-of-eratosthenes sieve

我正在尝试创建一个程序,该程序输出给定输入值的素数列表,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 个答案:

答案 0 :(得分:4)

您无法通过计算sizeof(num_primes)来确定素数的数量:这是一个编译时常量,它不会随您在num_primes中放置的值而改变。看起来您的系统对int使用了四个字节,因此从零到大小为+ 1(包括0和1)的迭代涵盖了索引0,1,2,3,4和5,这与您的观察结果一致数字打印出来。

如果SieveEratosthenes返回它找到的素数,那么你的循环应该从零迭代到那个数字,而不是sizeof(num_primes)

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

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