Ir ao conteúdo
  • Cadastre-se

Problema com vetor: "runtime error"


Posts recomendados

Saudações galera, estou tentando resolver mais um problema no URI e meu código funciona perfeitamente para todos os casos de teste, mas quando envio para o URI ele retorna com um "Runtime Error". Já tentei fazer de diversas formas diferentes, mas sempre com este problema. Talvez um olhar diferente poderia me ajudar, segue o código comentado:

 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int * dectobin();
int vect(int z);

int main()
{
	int *x,*y,*z,i,l,n,u,a,b,res,aa,bb,cont;

	while((scanf("%d %d",&a,&b))!=EOF){
		if(a==0){
			printf("%d\n",b );
		}
		else{
			if (b==0){
				printf("%d\n",a);
			}
			else{


			// Transforma em binários
			res = 0;
			x = dectobin(a,&aa);
			y = dectobin(b,&bb);
			//Verifica o tamanho do maior para o último digito da conta p/ o tamanho do vetor z
			if(aa>bb){
				i = aa;
				n = 1;
			}
			else{
				if(aa<bb){
					i = bb;
					n = 2;
				}
				else{
					n = 0;
					i = aa;
				} 
			}
			//Cria o vetor Z
			z = (int*) malloc((i)*sizeof(int));
			//Preenche o vetor Z com o modo MOFIZ
			for (l=0;l<(i);l++){
				if (x[l]==1 && y[l]==1){
					z[l] = 0;
				}
				else{
					if(x[l]==0 && y[l]==0){
						z[l] = 0;
					}
					else z[l] = 1;
				}
			}

			n = aa;
			u = bb;

			for (l=i;l>(-1);l--){
			//	printf("%d\n",l);
				if(n==(-1)){
					z[l]=y[u];
				}

				if(u==(-1)){
					z[l]=x[n];
				}

				if(y[u]==0 && x[n]==0){
					z[l] = 0;
				}
				else{
					if(y[u]==1 && x[n]==1){
						z[l] = 0;
					}
					else z[l] = 1;
				}

				n--;
				u--;
			}
		/*	
			printf("\n");
			for (l=0;l<aa+1;l++){
				printf("%d ",x[l]);
			}
			printf("\n");
			for (l=0;l<bb+1;l++){
				printf("%d ",y[l]);
			}
			printf("\n");
			for (l=0;l<i+1;l++){
				printf("%d ",z[l]);
			}
			printf("\n\n");
		*/	
			cont = 0;

			for(;;){

				if(cont==i+1) break;
			//	printf("CONT: %d\n",(cont) );
			//	printf("RES = 2^%d * %d + %d\n",cont,z[i-cont],res);
				res = ((pow(2,cont))*z[i-cont]) + res;

				cont++;

				
			}

			printf("%d\n",res );

			}
		}
	}
	return 0;
}

int * dectobin(int x, int *k){ // para retornar um vetor, coloco um asterisco antes da função

	int i=0,z,n,*v;
	long int pot; // Estou utilizando long int %li porque aqui cabem mais de 31 bits.
	
	//Verifica o tamanho do binário (quantidade de casas é igual a número de bits
	i = vect(x);

	v = (int*) malloc((i+1)*sizeof(int)); // Cria o vetor de inteiros.

	z = 0; // Esse será o contador.

	//Prenche o vetor com os binários
	for(n=i;n>=0;n--){
		
		pot = (pow(2,n));

		if (pot<=x){
			v[z] = 1;
			x = x - pot;
		}
		else{
			v[z]=0;
		}
		z++;
	}

	*k = i;
	return v;
}

int vect(int z){

	int i=0;

	for(;;){
		i++;
		if(z==1) break;
		else z = z/2;
	}

	return i;	
}

Para testar é só criar um arquivo com as entradas e indicar ele para o programa, ex:

teste.exe < entradas.txt

 

Link para o comentário
Compartilhar em outros sites

Pela questão, parece que é para ensinar a utilizar operadores lógicos em C:

 

&  -> Operador lógico 'E'

|   -> Operador lógico 'OU'

^   -> Operador lógico 'XOR'

~a -> retorna o inverso do valor contido na variável 'a'

 

 

Então, ficaria assim:

 

scanf("%lu %lu", &valor1, &valor2);

portaAND1 = valor1 & ~valor2; /* Primeira porta AND contendo uma das entradas invertidas */
portaAND2 = ~valor1 & valor2; /* Segunda porta AND contendo a outra porta invertida */
portaOR = portaAND1 | portaAND2; /* A saída das duas primeiras portas passam pela porta OR */

printf("%lu", portaOR);

 

 

Todo esse processamento, no final será equivalente a porta XOR, podendo resumir ainda mais o código para:

 

scanf("%lu %lu", &valor1, &valor2);

printf("%lu", valor1 ^ valor2);

 

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

Desculpe @ScreenBlack eu realmente não sabia que esses operadores existiam! Estou perplexo.

Meus professores não falaram nada sobre isso. Eu estava fazendo o código que fazia isso manualmente, ou seja, recriando a roda.

 

Muito obrigado mesmo.

 

Eu pensava que o | e o && só poderiam ser utilizados para casos de teste dentro de um if por exemplo. Não sabia que eles eram operadores de bits, trabalhando direto com o binário do decimal.

 

Eu li o seu post e não acreditei que iria funcionar, pois não tinha noção disso. Aí coloquei e deu certo o.O! Acabei de ler duas páginas que me ensinaram mais um pouco sobre eles, essa e essa.

 

Obrigado mesmo! 

Link para o comentário
Compartilhar em outros sites

Operador '&' é diferente do operador '&&'

O primeiro trata a operação entre duas variáveis (ou conjuntos).

O segundo faz a comparação entre duas variáveis (ou conjuntos).

 

Caso não queira trabalhar com operadores, poderia fazer utilizando bit mask e tratar bit a bit.

Seria um processo muito mais trabalhoso, pois teria de tratar 64 bits (32 bits de uma variável mais 32 bits de outra)

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

Visitante
Este tópico está impedido de receber novas respostas.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!