Simples gerador de números primos

Publicado por Perfil removido (última atualização em 28/03/2018)

[ Hits: 4.008 ]

Download 6784.




Um código simples, com algorítimo não otimizado, para gerar números primos em "ranges" passados como parâmetros. O "output" é organizado em colunas, usando o caractere '\t' como separador e quebrando a linha quando atingido 80 colunas.

Exemplo de uso (considerando o nome do binário como "a.out"):

$ ./a.out 1 100

  



Esconder código-fonte

/* This is free and unencumbered software released into the public domain. */
#include <sys/types.h>

#include <err.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

#define COLUMNS 80
#define SAFEZON 8

#ifndef __progname
extern char *__progname;
#endif

#ifndef getprogname
#define getprogname( ) __progname
#endif

#ifndef setprogname
#define setprogname(x) __progname = x
#endif

static int
numlen(ssize_t num) {
   ssize_t res;

   for (res = 0; num; res++)
      num /= 10;

   return res;
}

static ssize_t
strtobase(const char *str, ssize_t min, ssize_t max, int base)
{
   ssize_t res;
   char *end;

   errno = 0;
   res   = strtoll(str, &end, base);

   if (end == str || *end != '\0')
      errno = EINVAL;

   if (res > max || res < min)
      errno = ERANGE;

   if (errno)
      err(1, "strtobase %s", str);

   return res;
}

static void
usage(void)
{
   fprintf(stderr, "usage: %s from to\n", getprogname());
   exit(1);
}

int
main(int argc, char *argv[])
{
   ssize_t i, from, to;
   int chrp, ndiv;

   setprogname(argv[0]);
   argc--, argv++;

   if (argc < 2)
      usage();

   from = strtobase(argv[0], 1, SSIZE_MAX, 10);
   to   = strtobase(argv[1], 1, SSIZE_MAX, 10);

   chrp  = 1;
   for (; from < to; from++) {
      i    = 1;
      ndiv = 0;

      for (; i < from; i++) {
         if (!(from % i) && (i != 1 && i != from)) {
            ndiv++;
            break;
         }
      }

      if (ndiv)
         continue;

      if ((chrp += numlen(from) + SAFEZON) > COLUMNS) {
         putchar('\n');
         chrp  = 1;
      }

      printf("%zd", from);

      if ((from + 1) < to)
         putchar('\t');
   }
   putchar('\n');

   return 0;
}

Scripts recomendados

Chuva de janelas

Validador de CPF

Pipeling

Calculadora em shell

Compactador Simples


  

Comentários
[1] Comentário enviado por paulo1205 em 19/04/2018 - 13:14h

Para que iniciar a variável “i” com o valor 1 e depois, dentro do laço de repetição se “i!=1”? E se “i” será, por construção, sempre menor que “from” (cláusula de repetição do comando for), para que ficar testando dentro do laço se “i!=from”?

Sinceramente, não dá para entender.

[2] Comentário enviado por removido em 24/04/2018 - 20:53h

Comentário enviado por paulo1205 em 19/04/2018 - 13:14h
Para que iniciar a variável “i” com o valor 1 e depois, dentro do laço de repetição se “i!=1”?

O laço de repetição é quebrado assim que algum valor divisivel é encontrado entre 1 é "from", mas de fato é meio estupido checar a condição todas as vezes, eu deveria ter iniciado a variavel com 2.

Comentário enviado por paulo1205 em 19/04/2018 - 13:14h
E se “i” será, por construção, sempre menor que “from” (cláusula de repetição do comando for), para que ficar testando dentro do laço se “i!=from”?

Isso foi pura falta de atenção.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts