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