eratostenes.c
Código
Desde hace tiempo quería hacer un programa que dispusiese los números impares en seis columnas realizando sobre ellos una «Criba de Eratóstenes», que ha terminado siendo este tonto programita en c, reutilizando el de Palabras Primas que había hecho en el 2017. Ya en ese entonces había jugado con la criba y el número de artículos de la Constitución Española, eliminando los no primos con una arbitrariedad como otra cualquiera.
No tiene mayor gracia, pues a pesar de que puede aparentar tener algún patrón, la "primidad" vuelve a escaparse entre los dedos...
/*****************************************
eratostenes_6.c
Clasifica los números primos y no primos
en columna de 6 tomando en cuenta sólo los
impares
*****************************************/
#include <stdio.h>
#include <math.h>
#include <errno.h> // para errno
#include <limits.h> // para INT_MAX
#include <stdlib.h> // para strtol (convertir a número)
int primo(int p);
int main(int argc, char *argv[])
{
if (argc<2) {printf("USO: %s NUMERONATURAL [-v]\n", argv[0]); return 0; };
char *p;
int nummax;
int numero, numprimos=0;
// Convertimos argv[1] en un entero largo
errno = 0;
long conv = strtol(argv[1], &p, 10);
// Comprobamos errores: la cadena no representa un número entero
// o es mayor que el posible o menor de cero.
if (errno != 0 || *p != '\0' || conv > INT_MAX || conv < 1) {
printf("USO: %s NUMERONATURAL [-v]\n", argv[0]);
printf("\nO bien el valor entrado no era un número natural o excedía el valor posible.\n");
return 0;
} else {
// No error
nummax = conv;
if (argv[2]) printf("Vamos a calcular los números primos menores o iguales que %d\n", nummax);
}
printf("<html><body>\n");
printf("<style>\n");
printf("table {margin-left: auto;\nmargin-right: auto;\nwidth: 50%%;}\n");
printf("table td {width: 16%%;text-align:center;}\n.no {color:grey;}\n.si {color:red;}\n");
printf("</style>\n");
printf("<table>\n");
printf("<tr>");
for (numero = 1; numero <= nummax; numero+=2)
{
if (primo(numero)) {
printf("\t<td class=si>%d</td>", numero);
numprimos++;
}
else {
printf("\t<td class=no>%d</td>", numero);
}
if ((numero+1) % 12 == 0) printf("</tr>\n<tr>\n");
};
printf("</tr>\n");
printf("</table></body></html>\n");
if (argv[2]) {
if (numprimos) printf("Se han encontrado %d números primos menores o iguales que %d\n", numprimos, nummax);
else printf("No se han encontrado números primos menores o iguales que %d\n", nummax);
};
return numprimos; // Devolvemos el número de primos encontrados
}
/*****************************************
int primo(int p)
Determina si un número dado es primo
*****************************************/
int primo(int p){
int i;
if(p<2) return 0;
for(i=2;i<=sqrt(p);i++) if(p%i == 0) return 0;
return 1;
}