Primos

C / C++
Enviado por thotypous em Seg, 14/11/2005 - 20:03.C / C++

Um algoritmo bastante veloz para calcular primos, implementado em C.

O algoritmo é o seguinte: montamos uma tabela em que cada item representa um número. Começamos com a tabela zerada e marcamos 1 em todo número que não for primo. Para isso, basta percorrer a tabela a partir do número 2, e ir marcando todos os múltiplos de cada número com 1, pois, se ele é múltiplo de algum desses números, com certeza não é primo. Quando chegarmos a um número e ele não estiver marcado, significa que ele é primo, pois não é múltiplo de nenhum dos anteriores, caso contrário, estaria marcado. Note que se chegarmos a um número na tabela e ele estiver marcado, podemos pulá-lo: não precisamos marcar seus múltiplos, pois eles já estarão marcados. Afinal, pelo Teorema Fundamental da Aritmética, qualquer número natural pode ser escrito como um produto de números primos.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int tabela[100000];
  6.  
  7. int main()
  8. {
  9.  
  10.   int i, j;
  11.  
  12.   memset(tabela, 0, sizeof(tabela));
  13.  
  14.   printf("unsigned int primos[] = { 1, ");
  15.  
  16.   for(i = 2; i < sizeof(tabela)/sizeof(int); i++)
  17.   {
  18.    
  19.     if(tabela[i])
  20.       continue;
  21.    
  22.     printf("%d, ", i);
  23.    
  24.     for(j = i*i; j < sizeof(tabela)/sizeof(int); j+=i)
  25.       tabela[j] = 1;
  26.    
  27.   }
  28.  
  29.   printf("};\n");
  30.  
  31.   return 0;
  32.  
  33. }
  34.