Ir ao conteúdo
  • Cadastre-se

C Não estou conseguindo, contar os números repetidos


diogo moura

Posts recomendados

Em alguns testes meu código consegue passar, porém ele está dando 60 % de erro, Link da questão.

Alguns exemplos de entradas e saídas do udebug

30 10
12 18 5 11 30 5 19 19 23 15

Saída  = 1

------------------------

20 10
6 6 2 8 2 12 16 3 8 17 

Saída = 3

-----------------------

10 10
2 5 3 4 3 3 2 7 9 6 

Saída =  2

----------------------

O meu código falha nesse teste, nos outros ele imprime o resultado esperado.

10 10
4 2 3 4 4 5 2 2 4 9 

Saída = 2.

---------------------- 

Meu código.

#include <stdio.h>

int main(void)
{
	int a, m, i, j, cont;
	while(1)
	{
		scanf("%d %d", &a, &m);
		if(a == 0 && m == 0)
			break;
		int vetor[m], verifica[m];
		for(i = 0; i < m; i++)
		{
			verifica[i] = 0;
		}
		for(i = 0, cont = 0; i < m; i++)
		{
			scanf("%d", &vetor[i]);
		}
		for(i = 0; i < m - 1; i++)
		{
			for(j = i + 1; j < m; j++)
			{
				if(vetor[i] == vetor[j] && verifica[i] != 1 && verifica[j] != 1)
				{
					cont++;
					verifica[i] = 1;
					verifica[j] = 1;
				}
			}
		}
		printf("%d\n", cont);
	}
	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

4 2 3 4 4 5 2 2 4 9 

Observe que na sequência existe o penúltimo valor que é igual a 4 e quatro está na 8ª posição do vetor, pois quando acorre a verificação esse valor é ignorado já que para verifica != 1; é FALSE. Contudo quando i = 4 já não existe o valor ser ignorado porque tanto verifica != 1; TRUE quanto verifica[j] != 1; TRUE. Lembra que verifica != 1; é FALSE quanto j = 8, agora neste ponto em que i = 4 não mais acontece daí o BUG.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@diogo moura    seu código está quase certo apenas você colocou o cont fora do local certo, mas na página do uri existe um erro pois no segundo teste a resposta certa é 5 e lá está como se fosse 4, como está nessa imagem :

5a6133c8c81d4_2resp.jpg.83828e3b67879415441d015e6aa6d045.jpg

então seu código ficaria assim :

#include <stdio.h>
int main(){
    int a,m,i,j,cont;
    while(scanf("%d %d",&a,&m)!=EOF){
        if(a == 0 && m == 0)
            break;
        int vetor[m],verifica[m];
        for(i=0;i<m;i++)
            verifica[i]=0;
        cont=0;
        for(i=0;i<m;i++)
            scanf("%d",&vetor[i]);
        for(i=0;i<m;i++)
            if(vetor[i]==0)cont++;
        if(cont>0)cont--;
        for(i=0;i<m-1;i++){
            for(j=i+1;j<m;j++){
                if(vetor[i]==vetor[j]&&vetor[j]!=0){
                    cont++;
                    vetor[j]=0;
                }
            }
        }
        printf("%d\n",cont);
	}
	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Diogo não olhei o código todo, mas você não pode fazer isso --> 

 

int vetor[m],verifica[m];

 

esse m dentro dos colchetes não é permitido neste caso, pois m é uma variável não constante. Isso só seria possível se as variáveis vetor e verificar fossem ponteiros e você as inicializa-se com o operador new, assim:

 

int m = 10;

int* vetor = new int[m], *verificar = new int[m];

 

ou se m fosse um define, assim:

 

#define m 10

int main()
{
    int vetor[m];
    return 0;
}

 

ou se fosse uma variável const, assim:

 

int main()

{
    const int m = 10;
    int vetor[m];
    return 0;

}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@diogo moura    o @Derleyvolt  tem razão esse vetor precisa ser declarado lá no inicio antes da main,  e o scanf estava errado mesmo pois ele não termina com o fim do arquivo EOF mas sim quando digitar zero zero,  agora que vi isso ,  então seu código modificado ficaria assim :

#include <stdio.h>
#include <string.h>
int vet[10001];
int main(){
    int a,m,t,cont,i;
    while (scanf("%d %d",&a,&m) && a != 0 && m != 0){
        for(i=0;i<10001;i++)
        vet[i]=0;
        cont = 0;
        for(i=0;i<m;++i){
            scanf("%d",&t);
            vet[t]++;
            if(vet[t]==2)
                cont++;
        }
        printf("%d\n", cont);
    }
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Pessoal tem impressão de que nós estamos confusos ainda. Observe que nos exemplos da entrada e saída temos

10 horas atrás, devair1010 disse:

seu código está quase certo apenas você colocou o cont fora do local certo, mas na página do uri existe um erro pois no segundo teste a resposta certa é 5 e lá está como se fosse 4, como está nessa imagem :

5a6133c8c81d4_2resp.jpg.83828e3b67879415441d015e6aa6d045.jpg

Acima o que@devair1010

Tirou do site, na primeira entrada vemos que apenas o número 3 repetiu, logo a saída: 1

Depois temos no segundo teste que os números 6, 1, 3, 2 repetem, logo a saída: 4

 

Então deve existir uma busca que conta as repetências e apague-as do vetor, depois que a tarefa de apagar ou excluir as repetências um clausula IF verifica se existiu repetências e incrementa o contador exemplo:

 

j inicia com 0 e h com sempre j + 1;

6 1 3 6 6 4 2 3 1 2 Em dado instante  j  no vetor[j] é 6

No mesmo instante h no vetor[h] é 6 então incrementa repetição++ depois (enviar 6 para o lugar do 1 no vetor) ficando assim:

6 6 3 1 6 4 2 3 1 2, daí incrementa j++ depois será outra vez de h no vetor ser 6 outra vez daí troca com 3 fica assim:

6 6 6 1 3 4 2 3 1 2, de novo j++, e h atingirá o limite e por fim uma clausula IF verifica se repetição tem valor SE verdadeiro então saida++. Depois disso j não será j = 1, e sim j = 3 que no vetor[j] corresponde a 1. Retomando o mesma tarefa de antes com h fazendo o ciclo até que h seja o último valor na largura do vetor e j o penúltimo o que finaliza a busca logo depois. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
int main(void) {
    int m= 1, a= 1;

    // LARGURA do vetor
    scanf(" %d%d",&a,&m);
    while(m || a) {
        {//<...>Bloco Anônimo
        int lista_ivet[m], j, repeticao, saida= 0, h= -1;
        while(++h < m)
            scanf(" %d",h+lista_ivet);

        j= -1;
        m= m + j;
        while(++j < m) {
            repeticao= h= j;
            while(++h < m || h == m) {
                if(lista_ivet[j] == lista_ivet[h]) {
                    int t= lista_ivet[j + 1];
                    lista_ivet[++j]= lista_ivet[h];
                    lista_ivet[h]= t;
                    }
                }
            if(repeticao != j)
                saida++;
            }
        printf("%d\n",saida);
        }//<...>
        // LARGURA do vetor
        scanf(" %d%d",&a,&m);
        }
    return 0;
    }

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu sei que isso não se pode fazer, mas como eu saberia o tamanho do vetor que o usuário digitou,

scanf("%d",tamanho);


int vetor[tamanho]; //o tamanho do vetor passaria a ser o numero que o usario digitou

@Derleyvolt

adicionado 5 minutos depois

Como você está colocando valores no vetor?

 

Poderia me explicar esse parte

@devair1010

vet[t]++;
if(vet[t] == 2)
	cont++;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

como você não sabe o valor que o usuário vai digitar, ou seja, o valor é dinâmico.. então você precisa usar alocação dinâmica, assim:

scanf("%d",tamanho); 

int* vetor = new int[tamanho]; // alocação dinâmica

código aqui..

delete[] vetor; // lembre-se sempre de liberar a memória

ou poderia usar o std::vector, mas creio que você ainda não conheça..

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@diogo moura       essa parte do código funciona assim :

           quando ele pega o número digitado pelo usuário ele vai lá no vetor vet na posição referente a esse número e incrementa o valor dessa posição e então na primeira vez que o número for digitado essa posição passa para o valor hum, mas se esse mesmo número for digitado novamente então essa mesma posição é incrementada novamente passando assim a valer dois, então é porque o número repetiu e com isso o contador será incrementado já se o mesmo número for digitado novamente essa mesma posição será incrementada novamente passando para três, mas nesse caso como já contou que esse número repetiu o contador não será incrementado .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!