Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
diogo moura

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

Recommended Posts

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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;
}

 

Editado por devair1010
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Cara eu tentei enviar a seu código só que recebi 100% de erro o que será que aconteceu?@devair1010

    • Curtir 1

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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. 

    Editado por Mauro Britivaldo
    Bug com [i conchetes
    • Curtir 1

    Compartilhar este post


    Link para o post
    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;
        }

     

    Editado por Mauro Britivaldo
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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 .

    Editado por devair1010
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×