Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

victorbrt

Problema com função que procura por numeros não repetidos

Recommended Posts

Pessoal, estou com um problema que não consigo resolver. Implementei essa função para verificar por números que não sejam repetidos num vetor de tamanho n (alocado dinamicamente com malloc) e funciona perfeitamente, exceto com o número 1, que não mostra a mensagem de que ele não é repetido. Alguém teria idéia do porque?

 

void naoRepetidos (int n, int *vet){
   int i, j, achou = 0;
   for (i = 0; i < n; i++){
       for (j = i+1; j < n; j++){
           if (vet[i] == vet[j]){
               achou = 1;
           }
       }
       if (!achou){
           printf ("\nO numero %d nao se repete", vet[i]);
       }
   }
}

 

Não vejo problema nenhum na lógica. Com qualquer número está funcionando perfeitamente, menos com 1. Já tentei de tudo e não vejo solução. Se alguém tiver alguma idéia eu agradeço.

 

EDIT: descobri que não estava acontecendo apenas com o número 1, e também percebi um erro: eu não estava re atribuindo 0 a variável achou.

 

Porém tentei isso e ainda assim não está dando certo:

 

void naoRepetidos (int n, int *vet){
    int i, j, achou;
    for (i = 0; i < n; i++){
        achou = 0;
        for (j = i+1; j < n; j++){
            if (vet[i] == vet[j]){
                achou = 1;
            }
        }
        if (!achou){
            printf ("\nO numero %d nao se repete", vet[i]);
        }
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A resposta é simples, veja como ficaria o processamento desse array:

int v[] = {1, 2, 3, 1, 4, 5};

1º i = 0;

procura pela ocorrencia do número 1 no vetor. O número se repete, não faz nada

 

2º i = 1;

procura pela ocorrencia do número 2 no restante do vetor. O número não se repete

 

3º i = 2;

procura pela ocorrencia do número 3 no restante do vetor. O número não se repete

 

4º i = 3; (aqui está o problema)

- procura pela ocorrencia do número 1 no restante do vetor. Mas no restante do vetor (1, 4, 5) não existe outra ocorrencia do número 1, por tanto seu algoritmo diz que o número não se repete;

 

... continua o processamento

 

Veja que o problema está em buscar a outra ocorrência do número no restante do vetor, pois ao analizar a última ocorrencia você não encontrará uma repetição deste número.

 

Você pode fazer j = 0, para analizar todo o vetor, ai você pularia o instante em que o j é igual a i, ou tentar algo mais eficiente...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo, é exatamente isso, eu estava analisando meu algoritmo e saquei que era esse o problema agora pouco.

 

Preciso achar só uma saída pra isso agora, estou tentando aqui mas tá difícil. Eu sou péssimo pra pensar e resolver algum problema de lógica.

 

Valeu Danilo.

 

EDIT: consegui com a sua dica. Veja só:

 

void naoRepetidos (int n, int *vet){
    int i, j, achou;
    for (i = 0; i < n; i++){
        achou = 0;
        for (j = 0; j < n; j++){
            if (vet[i] == vet[j] && i != j){
                achou = 1;
            }
        }
        if (achou == 0){
            printf ("\nO numero %d nao se repete", vet[i]);
        }
    }
}

Deu certinho, agora não sei se essa é a pior lógica possível, hehehe. Na prática ele se tiver algum número repetido, ele percorre duas vezes a mesma coisa, o que não é muito bom. Você disse que eu poderia tentar algo mais eficiente, você tem alguma idéia de um jeito melhor de resolver esse algoritmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom d+,

 

Agora sobre a lógica, existem várias maneiras, vai depender da sua criatividade. =)

Por exemplo, você pode fazer uma cópia desse vetor e dps orderna ela, pq assim os número repetidos ficarão todos juntos, então em uma única passada ( O(n) ) você consegue encontrar todos os números que se repetem...

 

Se você está começando a programar agora e acha bacana essa lance de lógica, eu sugiro esse site aqui: http://br.spoj.pl/

É um exelente lugar para você treinar, comece por problemas mais simples (http://br.spoj.pl/problems/obi/sort=-6) de preferencia aqueles que muitas pessoas já resolveram.

 

Se precisar de qualquer coisa estou a disposição.

 

Flws

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.