quarta-feira, fevereiro 23, 2011

Programação em C - Verificador de números primos GRANDES


#include <stdio.h>
#include <stdlib.h>

// Versão de números grandes de um verificador de números primos

int main(int argc, char* argv[])
{
unsigned long long int i;
unsigned long long int num = strtoull(argv[1], NULL, 10);

for ( i = 2 ; i < num ; i++ )
{
if ( num % i == 0 )
{
printf("num = %llu NÃO é primo\n", num);
exit(0);
}
}
printf("num = %llu é primo\n", num);
return 0;
}

// Compilar: gcc prog.c -o prog.exe
// Rodar: ./prog.exe numero
// Exemplo: ./prog.exe 71
// Saida : 71 é primo

4 comentários:

Thatha disse...

Professor, poderia comentar os códigos? Pois, por exemplo, não entendo por que chama o long 2 vezes consecutivas: "unsigned long long int i;
unsigned long long int num = strtoull(argv[1], NULL, 10);"

Acredito que vários estão com a mesma dúvida, se não, eu pelomenos gostaria de saber. Grato, Ewerton Lira

Henrique Marks disse...

Porque, por motivos históricos, unsigned long int representa um inteiro de 4 bytes sem sinal, enquanto unsigned long long int representa um inteiro de 8 bytes sem sinal.

Ou seja, se queremos números grandes sem sinal, usa-se unsigned long long int.

O seguinte mini-programa é útil para saber os tamanhos dos tipos:

#include
#include

int main(void)
{
int i;
i = sizeof(double);
printf("tam double = %d bytes\n", i);
i = sizeof(int);
printf("tam int = %d bytes\n", i);
i = sizeof(char);
printf("tam char = %d bytes\n", i);
i = sizeof(float);
printf("tam float = %d bytes\n", i);
i = sizeof(long int);
printf("tam long int = %d bytes\n", i);
i = sizeof(long long int);
printf("tam long long int = %d bytes\n", i);
i = sizeof(short int);
printf("tam short int = %d bytes\n", i);
i = sizeof(long double);
printf("tam long double = %d bytes\n", i);
}

Pode colocar outros tipos e modificadores se quiser no código. Todos os tipos e modificadores encontram-se em qualquer manual de C, apostila, internet, etc.

Henrique Marks disse...

A função strtoull converte uma string (que foi passada como parâmetro para o programa) em um unsigned long long de base 10.

o primeiro argumento é a string, o último é a base. O segundo não é usado, por isso passei um ponteiro NULO (NULL).

Thatha disse...

Valeu Teacher! é bom saber!