Implementazioni di algoritmi/Crivello di Eratostene: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 6:
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 2500
 
#ifdef INT128BIT
int main(int argc, char *argv[]) {
//Con questa definizione l'algoritmo dovrebbe supportare interi a 128bit.
unsigned long int numb[LENGTH];
//Richiede la compilazione con GCC e processore a 64bit per SO UNIX. Purtroppo
unsigned long int i=0, k=2;
//non è stato testato e non può essere considerato funzionante.
#include <stdint.h>
for( i=0; i<LENGTH; i++ ) {
typedef uint64_t __int_t;
numb[i] = i;
//Definizione del numero massimo del setaccio.
}
//Ricordate che se dichiarate n, il valore massimo controllato sarà n-1!
numb[1] = 0;
//il valore definito è il massimo possibile per questo tipo
i = 0 ;
#define UPPER_LIMIT UINT64_MAX
while( i<LENGTH ) {
#endif
if( numb[i] == 0 ) {
 
i++;
 
} else {
#ifndef INT128BIT
for( k=2; (k*i) <= LENGTH; k++ ) {
typedef unsigned long int __int_t;
numb[k*i] = 0;
//Definizione del numero massimo del setaccio.
}
//Ricordate che se dichiarate n, il valore massimo controllato sarà n-1!
i++;
//il valore definito è il massimo possibile per questo tipo.
}
#define UPPER_LIMIT 65534
}
#endif
 
for( i=0; i<LENGTH; i++ ) {
#define MAXNUM 5000
if( numb[i]!=0 ) {
 
printf("%ld\n", numb[i] );
int main()
}
{
}
//Definizione variabili
__int_t* num_matrix;
__int_t i=0, t=0, k=2;
int a=0; //(solo per la stampa dei risultati)
 
if ( MAXNUM >= UPPER_LIMIT )
return 1;
//Inizializza il vettore del setaccio.
num_matrix=(__int_t*)malloc(MAXNUM*sizeof(__int_t));
for (i=0; i < MAXNUM; i++)
num_matrix[i]=i;
//Eliminazione dal crivello di 1
num_matrix[1]=0;
//Crivello di Eratostene.
//Si consideri che l'algoritmo è semplificato e potrebbe essere
//enormemente migliorato, evitando ad esempio cicli inutili.
//Pseudocodice:
//per i da 0 al valore massimo
// per il multiplo k di i
// per t da 0 al valore massimo
// se il numero t del vettore non è già stato eliminato
// se il resto della divisione intera tra il numero t \
// e il multiplo k di i è uguale da zero
// escludi il numero t dal vettore (=0)
for (i = 0; i < MAXNUM; i++)
{
if ( num_matrix[i] != 0 )
{
for (k = 2; k < MAXNUM; k++)
{
for (t = 0; t < MAXNUM; t++)
{
if ( num_matrix[t] != 0 )
{
if ( (num_matrix[t]%(k*i)) == 0 )
num_matrix[t]=0;
};
};
};
};
};
//Fine algoritmo
//Stampa risultati (10 per riga)
i=0; a=0;
for (i=i; i < MAXNUM; i++)
{
if ( num_matrix[i] != 0 )
{
fprintf(stdout, "%ld\t", num_matrix[i]);
a++;
if ( a == 9 )
{
fprintf(stdout, "\n");
a=0;
};
};
};
free(num_matrix);
return 0;
}
</source>