Ir ao conteúdo
  • Cadastre-se
Reberth Siqueira

C RESOLVIDO Conversão de numero natural para binário com recursão - C

Posts recomendados

E ae!! Boa tarde!

 

 

 Preciso de ajuda com um exercicio da faculdade:

Citação

Crie um algoritmo recursivo que converta um número natural para binário

 

Então eu criei:

#include <stdio.h>

int bin(n){



    if(n >= 1){
        bin(n/2);
        printf("%i ", n%2 );
    }else{
    return n%2;
    }
}

int main(){
    bin(25);
return 0;
}

 

Eu utilizei o resultado de um vídeo no youtube para verificar se está correto e aparantemente está.

 

 A minha dúvida é referente a forma que eu utilizei para poder fazer o programa. Minhas dúvidas:

  • Tá certo colocar return somente no else?
  • Tá certo eu dar o printf só depois da chamada recursiva?

 

Agradeço a ajuda desde já!

att,

Reberth

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Reberth Siqueira meu chará

#include <stdio.h>

int bin(int n){



    if(n >= 1){
        bin(n/2);
        printf("%i ", n%2 );
    }else{
    return n%2;
    }
}

int main(){
	int n;
    bin(25);
return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, Herbertbahia disse:

@Reberth Siqueira meu chará


#include <stdio.h>

int bin(int n){



    if(n >= 1){
        bin(n/2);
        printf("%i ", n%2 );
    }else{
    return n%2;
    }
}

int main(){
	int n;
    bin(25);
return 0;
}

 

 

E ae kkkkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está certo? Isso é relativo por exemplo do ponto de vista do problema está certo. O que pode fazer é otimizar.

 

Caso queira otimizar deixa saber que é possível enxugar seu programa atual para duas linhas de maneira que o return é completamente desnecessário.

adicionado 2 minutos depois

Pensem nisso.

adicionado 4 minutos depois
2 horas atrás, Reberth Siqueira disse:

Tá certo eu dar o printf só depois da chamada recursiva?

É uma maneira certa.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Mauro Britivaldo disse:

Está certo? Isso é relativo por exemplo do ponto de vista do problema está certo. O que pode fazer é otimizar.

 

Caso queira otimizar deixa saber que é possível enxugar seu programa atual para duas linhas de maneira que o return é completamente desnecessário.

adicionado 2 minutos depois

Pensem nisso.

adicionado 4 minutos depois

É uma maneira certa.

Foi exatamente que eu percebi um tempo depois. Que bom.

Eu achava que pra utilizar recursão tinha que dar return em tudo... Ainda to aprendendo. Mas não desenvolvi lógicas muito mais apuradas.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá

 

Não há qualquer indicação de como retornar os valores, mas talvez ache mais flexível usar algo assim

void            i_to_strbin(int n, char** b)
{
    if (n >= 1)
    {
        i_to_strbin((n / 2), b);
        int len = strlen(*b);
        *(*b + len) = n % 2 + '0';
        *(*b + len + 1) = 0;
    }
}    // i_to_strbin()

Onde você passa em b o endereço de uma string vazia e com tamanho suficiente para conter o valor, e recebe a string em b correspondendo ao valor em binário de n, como esperado.
É a mesma coisa? Sim, mas nesse caso pode usar o resultado ---  retornado na string *b --- como preferir. No caso dessa função bin() só imprime via printf() separando cada dígito por um espaço.

 

Veja esse resultado para alguns valores conhecidos

1 em binario = [1]
2 em binario = [10]
3 em binario = [11]
4 em binario = [100]
5 em binario = [101]
6 em binario = [110]
7 em binario = [111]
8 em binario = [1000]
127 em binario = [1111111]
32767 em binario = [111111111111111]
2147483647 em binario = [1111111111111111111111111111111]
1073741824 em binario = [1000000000000000000000000000000]

Com essa função e esse programa de teste:

int main(int argc, char** argv)
{
    int            i;
    for ( i = 1; i <= 8; i+=1)
    {
        testa_com(i);
    }
    testa_com(127);
    testa_com(SHRT_MAX);
    testa_com(INT_MAX);
    testa_com(1 + INT_MAX/2);
    return 0;
}    // main()

Eis o programa todo

#define _CRT_SECURE_NO_WARNINGS
#include "limits.h"
#include "stdio.h"
#include "string.h"


void		i_to_strbin(int, char**);
void		testa_com(int);

int main(int argc, char** argv)
{
	int			i;
	for (i = 1; i <= 8; i += 1)
	{
		testa_com(i);
	}
	testa_com(127);
	testa_com(SHRT_MAX);
	testa_com(INT_MAX);
	testa_com(1 + INT_MAX / 2);
	return 0;
};	// main()


void			i_to_strbin(int n, char** b)
{
	if (n >= 1)
	{
		i_to_strbin((n / 2), b);
		int len = strlen(*b);
		*(*b + len) = n % 2 + '0';
		*(*b + len + 1) = 0;
	}
};	// i_to_strbin()


void testa_com(int i)
{
	char	v[80];
	char* p = v;

	v[0] = 0;
	i_to_strbin(i, &p);
	printf("%i em binario = [%s]\n", i, p);
	return;
};	// testa_com()


limits.h é o header onde estão essas constantes limite como INT_MAX e SHRT_MAX .

 

 

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

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

×
×
  • Criar novo...