问题描述
我正在用C编写“ Eratosthenes筛”的代码,该代码将打印所有素数到n。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include "input2.h"
int main()
{
int n = read_int();
int length = n-1;
int *block_of_memory = (int *)malloc(sizeof(int));
for(int i = 2; i <= length; i++)
{
block_of_memory[i] = 1;
}
for(int i = 2; i*i <= length; i++)
{
if(block_of_memory[i] == 1)
{
for(int j = i*i; j < length; j = j+i)
{
block_of_memory[j] = 0;
}
}
}
for (int i = 1; i <= length; ++i)
{
if(block_of_memory[i] == 1)
{
printf("%d\n",i);
}
}
print_prime(block_of_memory,length);
free(block_of_memory);
return 0;
}
我不确定我在做什么错。当我想要所有主要的住宅区5(例如)时,我得到:
Give a number: 5
1
1
4,5,
解决方法
您没有分配足够的内存:
int *block_of_memory = (int *)malloc(sizeof(int));
实际上应该是:
int *block_of_memory = malloc(n * sizeof(int));
这样,您可以为整个n
个int数组分配空间,而不仅仅是一个int。另外,never cast the result of malloc。此外,您的代码还有一些逻辑错误:
for(int j = i*i; j < length; j = j+i)
{
block_of_memory[j] = 0;
}
实际上应该是:
for(int j = i*i; j <= length; j = j+i)
{
block_of_memory[j] = 0;
}
(请注意,< length
变为<= length
)。这样,每个元素都会得到正确检查,包括length - 1
处的元素。