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;
}

eratostenes.c

Ejecución

Una salida (tan absurda como otra) de este programa para los primeros 1000 números es la siguiente (aunque incluye algunos elementos de estilo que se han añadido en la cabecera de esta página web):

1 3 5 7 9 11
13 15 17 19 21 23
25 27 29 31 33 35
37 39 41 43 45 47
49 51 53 55 57 59
61 63 65 67 69 71
73 75 77 79 81 83
85 87 89 91 93 95
97 99 101 103 105 107
109 111 113 115 117 119
121 123 125 127 129 131
133 135 137 139 141 143
145 147 149 151 153 155
157 159 161 163 165 167
169 171 173 175 177 179
181 183 185 187 189 191
193 195 197 199 201 203
205 207 209 211 213 215
217 219 221 223 225 227
229 231 233 235 237 239
241 243 245 247 249 251
253 255 257 259 261 263
265 267 269 271 273 275
277 279 281 283 285 287
289 291 293 295 297 299
301 303 305 307 309 311
313 315 317 319 321 323
325 327 329 331 333 335
337 339 341 343 345 347
349 351 353 355 357 359
361 363 365 367 369 371
373 375 377 379 381 383
385 387 389 391 393 395
397 399 401 403 405 407
409 411 413 415 417 419
421 423 425 427 429 431
433 435 437 439 441 443
445 447 449 451 453 455
457 459 461 463 465 467
469 471 473 475 477 479
481 483 485 487 489 491
493 495 497 499 501 503
505 507 509 511 513 515
517 519 521 523 525 527
529 531 533 535 537 539
541 543 545 547 549 551
553 555 557 559 561 563
565 567 569 571 573 575
577 579 581 583 585 587
589 591 593 595 597 599
601 603 605 607 609 611
613 615 617 619 621 623
625 627 629 631 633 635
637 639 641 643 645 647
649 651 653 655 657 659
661 663 665 667 669 671
673 675 677 679 681 683
685 687 689 691 693 695
697 699 701 703 705 707
709 711 713 715 717 719
721 723 725 727 729 731
733 735 737 739 741 743
745 747 749 751 753 755
757 759 761 763 765 767
769 771 773 775 777 779
781 783 785 787 789 791
793 795 797 799 801 803
805 807 809 811 813 815
817 819 821 823 825 827
829 831 833 835 837 839
841 843 845 847 849 851
853 855 857 859 861 863
865 867 869 871 873 875
877 879 881 883 885 887
889 891 893 895 897 899
901 903 905 907 909 911
913 915 917 919 921 923
925 927 929 931 933 935
937 939 941 943 945 947
949 951 953 955 957 959
961 963 965 967 969 971
973 975 977 979 981 983
985 987 989 991 993 995
997 999