Eratosthenes的筛选-C语言实现
我错过了一些东西,但我找不到它是什么。我还得到了一个input2.c文件,它有一个print_prim函数,我不允许更改 对于n=10,它始终处于打印状态Eratosthenes的筛选-C语言实现,c,for-loop,sieve-of-eratosthenes,sieve,C,For Loop,Sieve Of Eratosthenes,Sieve,我错过了一些东西,但我找不到它是什么。我还得到了一个input2.c文件,它有一个print_prim函数,我不允许更改 对于n=10,它始终处于打印状态 4, 5, 7, 9, 我知道在print\u prim函数中有一个I+2,但我无法解决它。同样,我不允许更改print_prim函数。有人能看到我错过了什么吗 main.c #包括 #包括 #包括“input2.h” int main(){ int n=lese_int(); int-laenge=n-1; int*数组; 数组=m
4, 5, 7, 9,
我知道在print\u prim函数中有一个I+2,但我无法解决它。同样,我不允许更改print_prim函数。有人能看到我错过了什么吗
main.c
#包括
#包括
#包括“input2.h”
int main(){
int n=lese_int();
int-laenge=n-1;
int*数组;
数组=malloc(sizeof(int)*laenge);
对于(int i=2;i)重新格式化代码
帮助您的一个常见步骤是向我们提供格式
#include <stdio.h>
#include <stdlib.h>
#include "input2.h"
int main ( void )
{
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;
}
}
}
for ( int i = 0; i < laenge; i++ )
{
printf( "%d, ", array[i] );
}
printf( "\n" );
print_prim( array, laenge );
free( array );
return ( 0 );
}
注意:这种风格是个人风格的,并不是像我一样使用间隔或卷曲大括号来制造像燃烧战争这样的宗教
读取时发现错误:
您使用C99。在更改某些内容之前考虑到这一点。(了解您的语言)
您对n-1
元素进行内存分配,但尝试从元素2
访问元素n
,这两个元素都包括在第一个for
循环中。(了解内存分配的工作原理)
数组从零开始(插入笑话),因此,您无法到达元素n
或元素n-1
print\u prim
仅打印包含1的数组元素的值加2。
换句话说:尝试定位数组中包含1的所有位置,并用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;
}
intmain(){
int n;
scanf(“%d”和“&n”);
int*a=(int*)malloc(sizeof(int)*(n-1));
对于(inti=0;i 对于(int i=2;i*i您能格式化您的代码吗?您可以分配malloc(sizeof(int)*(n-1))
但是您的循环运行,而i将i*j从print\u prim
函数中,很明显条目被移位了2。这意味着数字2位于索引0处。(int i=2;i hi@Holger哪个循环运行的2个元素太多了?一个特定的元素还是全部元素?我不确定这是否回答了问题。:/无论如何,没有问题。谢谢Mukul,这很好。你能解释一下你的方法吗?我想它们有点不同。内联FOR很难扩展。如果你想添加更多的行代码,你需要大括号,但新手程序员没有注意到。@aomerk,代码按两个元素移动,只是为了确保print\u prim
函数按预期工作。@JoséManuelRamos我认为你没有你想象的那么有帮助。请帮助我以外的人。@MukulGupta抱歉,我不理解的部分是,我一直在循环,直到j*I等等。你的数学有点不同。I*I,j=I+I和j+=I
#include <stdio.h>
#include <stdlib.h>
#include "input2.h"
int main ( void )
{
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;
}
}
}
for ( int i = 0; i < laenge; i++ )
{
printf( "%d, ", array[i] );
}
printf( "\n" );
print_prim( array, laenge );
free( array );
return ( 0 );
}
void print_prim ( int *array, int laenge )
{
for ( int i = 0; i < laenge; i++ )
{
if ( array[i] == 1 )
{
printf( "%d, ", i + 2 );
}
}
printf( "\n" );
}
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;
}