Ir ao conteúdo

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


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

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

Expandir  

 

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

  • Solução
Postado

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
  Em 15/11/2019 às 20:27, Reberth Siqueira disse:

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

Expandir  

É uma maneira certa.

  • Curtir 1
Postado
  Em 15/11/2019 às 22:47, 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.

Expandir  

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.

 

Postado

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 .

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades sobre tecnologia do Brasil. Leia mais

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!