• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

André Aparicio

Coisa esquisita

3 mensagens neste tópico

Boas, estou a fazer um programa para gerar número primos mas acontece uma coisa estranha.

Se testar os números dividindo por todos os números até à raiz do número tudo bem, mas se testar os números dividindo por primos que estão num ficheiro alguns dos números gerados pelo programa não são primos, mas nunca são os mesmo de cada vez que se corre o programa.

Isto pode dever-se a quê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sem ver o código é difícil, mas verifica bem o tipo de dados das variáveis que estás a utilizar. Pode ser por ai.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O essencial são estas funções.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define FICHEIRO "primos.txt"

void gerador() /****** Gera numeros primos ate pressionar uma tecla ******/
{
     char num[100];                             // String com a última linha lida
     int numero;                                // Numero a testar
     
     FILE *ficheiro;                            // Aponta para o ficheiro
     ficheiro = fopen(FICHEIRO,"a+");           // Abre o ficheiro em modo a+ 
     while( fgets(num,100, ficheiro) );          // Lê todas as linhas do ficheiro
     fclose(ficheiro);                          // Fecha o ficheiro
     numero = atoi(num);                        // Converte a última linha em inteiro
         
     while(kbhit() == 0)                        // Executa o ciclo enquando não for premida uma tecla
     {    
          numero = gerar_primo(numero);
          printf("%d\n", numero);            // Mostra o número primo
     } 
     getch();                                   // Obtém a tecla premida para limpar o buffer     
}
/*************************************************************************/

/*************************************************************************/
int gerar_primo(int ultimo) /**** Retorna e escreve o próximo primo do ficheiro ****/
{
    int numero = ultimo + 2;
            
    while (testar_primo(numero) != 0) numero = numero + 2;

    FILE *ficheiro;                    // Aponta para o ficheiro
    ficheiro = fopen(FICHEIRO,"a+");   // Abre o ficheiro em modo a+      
    fprintf (ficheiro, "\n%d",numero); // Escreve o numero no ficheiro    
    fclose(ficheiro);                  // Fecha o ficheiro
    return numero;                                            
}
/*************************************************************************/

/*************************************************************************/
int testar_primo(int numero) /******** Retorna 0 se o numero é primo ********/
{
    if (numero > 0 && numero <= 3) return 0;                       // Retorna primo para 1, 2 e 3    
    if (numero%2 == 0) return 2;                                 // Retorna 2 se for par    
    if (somar_algarismos(numero)%3 == 0) return 3;               // Retorna 3 se a soma dos algarismos for divisivel por 3
    FILE *ficheiro;
    ficheiro = fopen(FICHEIRO,"r");
    char div[100];
    int divisor;  
    while( fgets(div,100, ficheiro) && divisor*divisor <= numero )
    {
        divisor = atoi(div); 
        if (numero%divisor == 0)
        {
            fclose(ficheiro);
            return divisor;
        }
    }
    fclose(ficheiro);
       
    while (divisor*divisor <= numero)
    {
        divisor = gerar_primo(divisor);
        if (numero%divisor == 0) return divisor;
    }
    
    return 0;
}
/*************************************************************************/

/*************************************************************************/
int somar_algarismos(int num) /****** Retorna a soma dos algarismos ******/
{
    char numero[100];                      // Numero para somar os algarismos
    int tamanho;                           // Numero de algarismos do numero
    int soma = 0;                          // Soma dos algarismos
    char digito[100];                      // Algarismo
    
    sprintf(numero, "%d", num);            // Converte o numero inteiro para string    
    tamanho = strlen(numero);              //  Calcula o número de algarismos do número
    
    for (int n = 0; n < tamanho; n++)      // Percorre o número de algarismos
    {  
        sprintf(digito, "%c", numero[n]);  // Converte um caracter da string para string
        soma = soma + atoi(digito);        // Soma o numero de algarismos
    }
    return soma;
}
/*************************************************************************/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora