victorbrt 0 Denunciar post Postado Setembro 30, 2010 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
Daniloinf 3 Denunciar post Postado Setembro 30, 2010 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
victorbrt 0 Denunciar post Postado Setembro 30, 2010 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
Daniloinf 3 Denunciar post Postado Setembro 30, 2010 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
quitZAUMMM 18 Denunciar post Postado Outubro 1, 2010 É o spoj é ótimo para ir testando sua lógica e sempre buscando se aprimorar para passar pelos problemas com os melhores tempos ;D Meu usuário: http://br.spoj.pl/users/quit/ []s Compartilhar este post Link para o post Compartilhar em outros sites