pasar de decimal a cualquier base menor de 10

Iniciado por juanma31, 2 Abril 2014, 19:31 PM

0 Miembros y 1 Visitante están viendo este tema.

juanma31

hola, tengo q hacer este ejercicio pero no m sale bien. lo unico q e conseguido es q m salga el numero al reves. alguien m podria decir q puedo hacer para darle la vuelta? o hacerlo de otra forma? no s puede usar void, gracias.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    unsigned numero,base,cociente,resto,contador=0,i,total,diez,num,decimal;
    cout<<"escribe el numero que quieres convertir: ";
    cin>>numero;
    cout<<"la base a la que quieres pasarlo: ";
    cin>>base;
    cociente=numero;

    while(cociente>=base)
    {
        resto=cociente%base;
        cociente=cociente/base;
        cout<<resto;
        contador++;
    }

    return 0;
}


amchacon

¿Has dado pilas?

Otra opcion es ir guardando los digitos en un array y mostrarlo en orden inverso.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

noele1995

1 - Utiliza las etiquetas geshi para el código...
2 - Tienes muchas variables que no usas, incluido contador que lo incrementas en el bucle pero nunca llegas a usarlo
3 - Aun imprimiendo el numero al revés te dejas el ultimo dígito, cuando es menor que la base y mayor que cero,cociente seria directamente el dígito que te falta.
4 - Como ya ha dicho amchacon un array es una buena opción aunque también podrías almacenarlo en una variable numérica
Código (cpp) [Seleccionar]
    while(cociente > 0)
    {
if(cociente >= base)
{
digito = cociente % base;
cociente = cociente / base;
}
else
{
digito = cociente;
cociente = 0;
}
num_en_base += digito * pow(10,contador); //""Desplaza"" el digito contador veces a la izquierda
contador++;
    }

ivancea96

Propongo otra opción:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    unsigned numero=0,base=0,cociente=0, contador=1;
    cout<<"Escribe el numero que quieres convertir: ";
    cin>>numero;
    cout<<"La base a la que quieres pasarlo: ";
    cin>>base;
    cociente=numero;

    while(cociente>=base){
        cociente/=base;
        ++contador;
    }
    for(int i=contador;i>0;i--){
        cociente=numero;
        contador=i;
        while(contador>1){
            cociente/=base;
            --contador;
        }
        cout << cociente%base;
    }
    return 0;
}


Aquí, contador viene a representar las veces que se puede dividir el número.
Luego, va mostrando los restos, pero en orden inversa.

Yoel Alejandro

Sólo como un aporte, tomando el código de ivance y modificándolo para trabajar con arreglos creo que se ahorra un poco de cálculo ya que no será necesario encadenar un while dentro del for. La desventaja es que debemos crear dinámicamente un arreglo con una longitud igual a la cantidad esperada de cifras del número:
Código (cpp) [Seleccionar]

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   unsigned numero=0, base=0, cociente=0, contador=1;
   cout<<"Escribe el numero que quieres convertir: ";
   cin>>numero;
   cout<<"La base a la que quieres pasarlo: ";
   cin>>base;
   cociente=numero;

   /* cantidad de cifras en la base especificada */
   int n = 1;
   while ( cociente >= base ) {
      cociente/=base;
      ++n;
   }
   /* reservar arreglo de n cifras */
   unsigned *cifras = new unsigned[n];
   if ( cifras == NULL ) return -1;

   for (int i = 0; i < n; i++) {
      cifras[n - i - 1] = numero % base;
      numero /= base;
   }
   for (int i = 0; i < n; i++)
      cout << cifras[i];
   cout << endl;

   delete cifras;
   return 0;
}

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#5
Los códigos propuestos hasta ahora no guardan el nuevo número como tal.

Esta es mi propuesta que tendrá la limitación lógica, y escasa, de los dígitos que puede almacenar un long long int, y más si no es en base decimal ya que en estos casos los dígitos se disparan cuanto más baja es la base:


Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
   int num,i,base;
   long long int resto=0,num0=1;
   printf("Introduzca un numero : ");
   scanf("%d",&num);
   printf("Introduzca la base : ");
   scanf("%d",&base);
   for (i=0;num>=1 ;i++ ,num0*=10){
       resto+=(num%base)*num0;
       num=num/base;
   }
   printf("\n\n%lld\n\n",resto);
   return 0;
}


¡¡¡UUUPPPSSS, se me coló en C  ;)


¡¡¡¡ Saluditos! ..... !!!!





juanma31

gracias, el q m ha servido es el de ivancea96, se m ha olvidado decir q no podia usar arrays, graciass a todos

leosansan

#7
Cita de: juanma31 en  2 Abril 2014, 23:51 PM
gracias, el q m ha servido es el de ivancea96, se m ha olvidado decir q no podia usar arrays, graciass a todos

Sin arrays, más cortito pero haciendo uso de la librería math con un poco de mates y así nos ahorramos unas cuantas divisiones:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>

using namespace std;

int main(){
   int i,j,numero,base,digitos;
   cout<<"Escribe el numero que quieres convertir: ";
   cin>>numero;
   cout<<"La base a la que quieres pasarlo: ";
   cin>>base;
   digitos= (int)(log(numero)/log(base));
   cout <<numero<< " en base "<<base<< ": "<<endl;
   for (i=digitos; i>=0 ;i-- ,numero%=j) {
     j=pow(2,i);
     cout <<" "<<numero/j;
   }
   return 0;
}


Y para los seguidores del C con array:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <math.h>

int main(){
   int base,i,j,num,digitos,resto;
   printf("Introduzca un numero : ");
   scanf("%d",&num);
   printf("Introduzca la base : ");
   scanf("%d",&base);
   digitos= (int)(log(num)/log(base));
   int nueva_base[digitos+1];
   for (i=digitos;i>=0 ;i-- ,num/=base)
       nueva_base[i]=num%base;
   for (i=0;i<=digitos;i++)
       printf("%d ",nueva_base[i]);
   return 0;
}


¡¡¡¡ Saluditos! ..... !!!!



amchacon

Como veo que se ha convertido en un concurso, doy mi solución con pilas:

Código (cpp) [Seleccionar]
#include <iostream>
#include <stack>

using namespace std;

int main()
{
   int numero,base,cociente,resto;
   stack<int> Pila;

   cout<<"escribe el numero que quieres convertir: ";
   cin>>numero;

   cout<<"la base a la que quieres pasarlo: ";
   cin>>base;

   cociente=numero;

   while(cociente>=base)
   {
       resto=cociente%base;
       cociente=cociente/base;
       Pila.push(resto);
   }

   Pila.push(cociente);

   while (!Pila.empty())
   {
       cout<<Pila.top();
       Pila.pop();
   }
   return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

NikNitro!

No he querido mirar todas las soluciones, pero si no se puede usar arrays, lo que pienso es que (como vamos consiguiendo los valores menos significativos primero) empezar con un int resultado = 0; y en cada iteración sumarle el valor que calculamos x10^(num de iteración). (En caso de Hexadecimal o base mayor que 10 no valdría :s)

Saludos ;)