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

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

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

×