Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juanma31 en 2 Abril 2014, 19:31 pm



Título: pasar de decimal a cualquier base menor de 10
Publicado por: juanma31 en 2 Abril 2014, 19:31 pm
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;
}



Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: amchacon en 2 Abril 2014, 19:49 pm
¿Has dado pilas?

Otra opcion es ir guardando los digitos en un array y mostrarlo en orden inverso.


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: noele1995 en 2 Abril 2014, 20:17 pm
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
  1.    while(cociente > 0)
  2.    {
  3. if(cociente >= base)
  4. {
  5. digito = cociente % base;
  6. cociente = cociente / base;
  7. }
  8. else
  9. {
  10. digito = cociente;
  11. cociente = 0;
  12. }
  13. num_en_base += digito * pow(10,contador); //""Desplaza"" el digito contador veces a la izquierda
  14. contador++;
  15.    }


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: ivancea96 en 2 Abril 2014, 20:34 pm
Propongo otra opción:

Código
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    unsigned numero=0,base=0,cociente=0, contador=1;
  9.    cout<<"Escribe el numero que quieres convertir: ";
  10.    cin>>numero;
  11.    cout<<"La base a la que quieres pasarlo: ";
  12.    cin>>base;
  13.    cociente=numero;
  14.  
  15.    while(cociente>=base){
  16.        cociente/=base;
  17.        ++contador;
  18.    }
  19.    for(int i=contador;i>0;i--){
  20.        cociente=numero;
  21.        contador=i;
  22.        while(contador>1){
  23.            cociente/=base;
  24.            --contador;
  25.        }
  26.        cout << cociente%base;
  27.    }
  28.    return 0;
  29. }

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


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: Yoel Alejandro en 2 Abril 2014, 21:47 pm
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
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.   unsigned numero=0, base=0, cociente=0, contador=1;
  9.   cout<<"Escribe el numero que quieres convertir: ";
  10.   cin>>numero;
  11.   cout<<"La base a la que quieres pasarlo: ";
  12.   cin>>base;
  13.   cociente=numero;
  14.  
  15.   /* cantidad de cifras en la base especificada */
  16.   int n = 1;
  17.   while ( cociente >= base ) {
  18.      cociente/=base;
  19.      ++n;
  20.   }
  21.   /* reservar arreglo de n cifras */
  22.   unsigned *cifras = new unsigned[n];
  23.   if ( cifras == NULL ) return -1;
  24.  
  25.   for (int i = 0; i < n; i++) {
  26.      cifras[n - i - 1] = numero % base;
  27.      numero /= base;
  28.   }
  29.   for (int i = 0; i < n; i++)
  30.      cout << cifras[i];
  31.   cout << endl;
  32.  
  33.   delete cifras;
  34.   return 0;
  35. }


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: leosansan en 2 Abril 2014, 23:29 pm
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
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.    int num,i,base;
  5.    long long int resto=0,num0=1;
  6.    printf("Introduzca un numero : ");
  7.    scanf("%d",&num);
  8.    printf("Introduzca la base : ");
  9.    scanf("%d",&base);
  10.    for (i=0;num>=1 ;i++ ,num0*=10){
  11.        resto+=(num%base)*num0;
  12.        num=num/base;
  13.    }
  14.    printf("\n\n%lld\n\n",resto);
  15.    return 0;
  16. }

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


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: 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


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: leosansan en 3 Abril 2014, 07:18 am
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
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.    int i,j,numero,base,digitos;
  8.    cout<<"Escribe el numero que quieres convertir: ";
  9.    cin>>numero;
  10.    cout<<"La base a la que quieres pasarlo: ";
  11.    cin>>base;
  12.    digitos= (int)(log(numero)/log(base));
  13.    cout <<numero<< " en base "<<base<< ": "<<endl;
  14.    for (i=digitos; i>=0 ;i-- ,numero%=j) {
  15.      j=pow(2,i);
  16.      cout <<" "<<numero/j;
  17.    }
  18.    return 0;
  19. }
  20.  

Y para los seguidores del C con array:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main(){
  5.    int base,i,j,num,digitos,resto;
  6.    printf("Introduzca un numero : ");
  7.    scanf("%d",&num);
  8.    printf("Introduzca la base : ");
  9.    scanf("%d",&base);
  10.    digitos= (int)(log(num)/log(base));
  11.    int nueva_base[digitos+1];
  12.    for (i=digitos;i>=0 ;i-- ,num/=base)
  13.        nueva_base[i]=num%base;
  14.    for (i=0;i<=digitos;i++)
  15.        printf("%d ",nueva_base[i]);
  16.    return 0;
  17. }

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: amchacon en 3 Abril 2014, 11:02 am
Como veo que se ha convertido en un concurso, doy mi solución con pilas:

Código
  1. #include <iostream>
  2. #include <stack>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    int numero,base,cociente,resto;
  9.    stack<int> Pila;
  10.  
  11.    cout<<"escribe el numero que quieres convertir: ";
  12.    cin>>numero;
  13.  
  14.    cout<<"la base a la que quieres pasarlo: ";
  15.    cin>>base;
  16.  
  17.    cociente=numero;
  18.  
  19.    while(cociente>=base)
  20.    {
  21.        resto=cociente%base;
  22.        cociente=cociente/base;
  23.        Pila.push(resto);
  24.    }
  25.  
  26.    Pila.push(cociente);
  27.  
  28.    while (!Pila.empty())
  29.    {
  30.        cout<<Pila.top();
  31.        Pila.pop();
  32.    }
  33.    return 0;
  34. }
  35.  


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: NikNitro! en 3 Abril 2014, 11:12 am
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 ;)


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: Eternal Idol en 3 Abril 2014, 12:20 pm
¿Se convirtio en un concurso? Entonces estan desvirtuando el hilo e incumpliendo las reglas, por favor, dejen de pegar codigo sin necesidad. Los que sientan la irrefrenable necesidad de mostrar su codigo por favor abranse un blog.

Reglas:
Limitantes:
 El subforo, para defender sus objetivos, no aceptara peticiones de programas o códigos. Entiéndase lo siguiente (AQUÍ NO SE HACE LA TAREA DE NADIE)

•Se pregunta por conceptos abstractos. Aquí no estamos para hacerle el trabajo a nadie



Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: amchacon en 3 Abril 2014, 12:52 pm
¿Se convirtio en un concurso? Entonces estan desvirtuando el hilo e incumpliendo las reglas, por favor, dejen de pegar codigo sin necesidad. Los que sientan la irrefrenable necesidad de mostrar su codigo por favor abranse un blog.

Reglas:
Limitantes:
 El subforo, para defender sus objetivos, no aceptara peticiones de programas o códigos. Entiéndase lo siguiente (AQUÍ NO SE HACE LA TAREA DE NADIE)

•Se pregunta por conceptos abstractos. Aquí no estamos para hacerle el trabajo a nadie
Lo que voy a decir a continuación no es un ataque personal, solo es una crítica constructiva.

Aquí nadie hacemos el trabajo de nadie, creo que eso queda bastante claro viendo hilos. Nunca vas a encontrar un hilo en el que se responda a un user que ni siquiera ha posteado código (es como una regla no escrita entre programadores).

Me llama la atención que no quieras que la gente participe en el foro :huh:. El querer mantenerlo todo controlado al extremo no hace más que desanimar a la gente a no participar, un foro debe ser espontaneo y la gente no debe tener miedo a postear. De esa forma se consiguen aportes buenísimos, como en el post del laberinto (donde se propusieron varias formas para calcular la ruta de un laberinto, ya sea la ruta más corta o una ruta aleatoria cualquiera), o el post de calculo de PI donde debatimos sobre el algoritmo más eficiente (apurando a milésimas de segundo) o el de la calculadora parser. Todo eso es lo que hace que el foro esté vivo y sea divertido.

Y repito que no hemos echo ninguna tarea, solo hemos resuelto la duda en cuestión y después hemos empezado a postear nuestras versiones. La regla esa la hemos cumplido a rajatabla.

@Yoel_Alejandro: Sobre estas líneas de código:

Código
  1. unsigned *cifras = new unsigned[n];
  2. if ( cifras == NULL ) return -1;

A diferencia de malloc, new lanza una excepción cuando no puede allocar memoria.

Si quieres que en vez de una excepción devuelva NULL, debes usar "nothrow":

Código
  1. unsigned *cifras = new(nothrow) unsigned[n];
  2. if ( cifras == NULL ) return -1;


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: Eternal Idol en 3 Abril 2014, 13:46 pm
Aquí nadie hacemos el trabajo de nadie, creo que eso queda bastante claro viendo hilos. Nunca vas a encontrar un hilo en el que se responda a un user que ni siquiera ha posteado código (es como una regla no escrita entre programadores).

No estoy de acuerdo para nada, esta misma mañana tuve que editar/borrar dos hilos donde debido a que habian pasado 5 dias un usuario directamente publico codigo resolviendo el hilo. Y ademas estoy encontrando varios hilos donde se dan VARIAS soluciones COMPLETAS innecesariamente. Me parece que citandote se despeja cualquier tipo de duda al respecto: "Como veo que se ha convertido en un concurso, doy mi solución con pilas:". ¿Que importancia tiene que el usuario haya publicado codigo si otros le dan el trabajo resuelto? Es irrelevante, lo peor es que puede haberlo copiado y pegado de cualquier lado ese codigo ...

Me llama la atención que no quieras que la gente participe en el foro :huh:. El querer mantenerlo todo controlado al extremo no hace más que desanimar a la gente a no participar, un foro debe ser espontaneo y la gente no debe tener miedo a postear. De esa forma se consiguen aportes buenísimos, como en el post del laberinto (donde se propusieron varias formas para calcular la ruta de un laberinto, ya sea la ruta más corta o una ruta aleatoria cualquiera), o el post de calculo de PI donde debatimos sobre el algoritmo más eficiente (apurando a milésimas de segundo) o el de la calculadora parser. Todo eso es lo que hace que el foro esté vivo y sea divertido.

Mi funcion es hacer cumplir las reglas, no valorar los "aportes" que suponen hacer, ya han sido avisados repetidas veces, les recomiendo comprender el pedido POR FAVOR que les estoy haciendo, sino debere proceder a borrar sus participaciones como indican las reglas.

Y repito que no hemos echo ninguna tarea, solo hemos resuelto la duda en cuestión y después hemos empezado a postear nuestras versiones. La regla esa la hemos cumplido a rajatabla.

¿Es un chiste? ¿Solamente postearon versiones del codigo funcionales? ¿Solamente resolvieron la duda con el codigo? Eso es hacer tarea ajena, incumplieron las reglas. Y no, no era una duda lo que se planteaba en este hilo, te recomiendo leer con atencion lo siguiente: "hola, tengo q hacer este ejercicio pero no m sale bien". ¿Esta claro, verdad? Si TIENE que hacer un ejercicio es una tarea y ustedes se la resolvieron, ustedes hicieron tarea ajena. Por si te quedaba alguna duda: "no s puede usar void, gracias."


Sinceramente llegar a pensar que publicando codigo completo y funcional se esta respetando esta regla va mas alla de mi capacidad de comprension:
•Se pregunta por conceptos abstractos. Aquí no estamos para hacerle el trabajo a nadie

Dice conceptos abstractos, si conceptos abstractos dice la regla.


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: leosansan en 3 Abril 2014, 18:25 pm
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 ;)

Justo eso es lo que hace uno de mis códigos, por si hay alguna duda:

Código
  1. for (i=0;num>=1 ;i++ ,num0*=10){
  2.        resto+=(num%base)*num0;

No podrás decir querido E.I que yo inicie este NO concurso sino más bien aporte de ideas. Concretamente a mi, que en C++ ando muy justito, me ha venido de perlas la aportación de amchacón de usar pilas, por no hablar como ivancea96 se las ingenio para no usar arrays.

Con esto quiero decir que las aportaciones posteriores a una solución pueden ser aportaciones más que valiosas para aclarar conceptos abstractos, insisto como el no uso de arrays o el uso de pilas en otro caso. Creo que es un punto de vista que no has llegado a captar y que sin embargo enriquece al foro y sus usuarios.

Y me pregunto yo, ¿qué diablos te ha pasado para este cambio tan normativo?. En este momento esto parece un Gran Hermano cuando en meses y meses anteriores, sin más intervención tuya que para aclarar conceptos o dudas de nivel, todo ha ido como la seda. ¿Acaso ha cambiado a quién está detrás de las siglas de E.I, o te ha pasado algo a nivel particular?. Pues no, no entiendo el cambio de actitud,

Somos los primero en advertir a los usuarios que no cuelgan nada de código que no se hacen tareas, y a las pruebas me remito. Pero otra cosa es otra cosa, el aprender conceptos  los unos de los otros con las posteriores soluciones aportadas.

Yo en particular me siento alagado por las apreciaciones que de algunos códigos, modestos como es natural por mis conocimientos, han hecho de mí gente del nivel como amchacon, eferion y el mismo yoel_alejandro, piques sanotes aparte, en temas como el del laberinto, en un printf o en el ya nombrado tema del número Pi. Y muchísimo más he aprendido, y continuo aprendiendo y aclarándome conceptos abstractos y/o concretos.

¿Por qué crees que razón y el mundo está en tu contra?, ya que no somos los únicos advertidos estas días otras, y digo bien, estos días atrás después de meses y meses da bálsamo.

No se trata de que leas esto con intención de responder con las reglas, que ya te aclaro y/o contesto y/o reitero que hemos aclarado y/o aprendido conceptos de las sucesivas intervenciones, sino de que pienses como el mundo puede estar equivocado y tu tener la razón.

Y si las normas se han vuelto tan estrictas habría que proponer al dueño de este foro que reconsidere la nueva interpretación de las normas o su cambio.

Un saludo, uno.

P:D: Me queda una duda:¿durará este post o será borrado por la censura?. Es que tal como has puesto las cosas .........


Citar
Reglas del subforo:
Este no es un subforo donde se soliciten tareas, sino un lugar donde resolver dudas.
Si van a responder a un hilo por favor lean atentamente su contenido y comprueben que su aporte no haya sido hecho con anterioridad por otro usuario.
Si quieren agregar algo a un mensaje y nadie respondió a el mismo por favor editenlo, no creen uno nuevo.
Si van a crear un hilo tengan siempre en cuenta:
     10 pasos para plantear una duda informática
     FAQ : Como hacer preguntas "inteligentes"
Para mantener el orden y mejorar la organización del subforo, se recomienda el uso de las siguientes siglas o tags en los mensajes:
   [C] = Programa realizado en C standard.
   [C++] = Programa realizado en C++.
   [?] = Duda.
No se permite el publicar enlaces a programas compilados.


Me apunto al segundo punto y lo de abstracto no lo veo por ningún lado, al menos es estas normas particulares.


Título: Re: pasar de decimal a cualquier base menor de 10
Publicado por: Eternal Idol en 3 Abril 2014, 18:48 pm
No podrás decir querido E.I que yo inicie este NO concurso sino más bien aporte de ideas. Concretamente a mi, que en C++ ando muy justito, me ha venido de perlas la aportación de amchacón de usar pilas, por no hablar como ivancea96 se las ingenio para no usar arrays.

Si te queres poner el saco y te queda justo es problema tuyo, yo no te mencione. Usar pilas es un concepto abstracto, dejar el codigo que resuelve tarea ajena NO LO ES. Espero que comprendan esto, es muy sencillo.

Con esto quiero decir que las aportaciones posteriores a una solución pueden ser aportaciones más que valiosas para aclarar conceptos abstractos, insisto como el no uso de arrays o el uso de pilas en otro caso. Creo que es un punto de vista que no has llegado a captar y que sin embargo enriquece al foro y sus usuarios.

INSISTO: para resolver el ejercicio de un usuario. Si de verdad no lo entienden no hay ningun problema, procedere a actuar como dicen las reglas claramente.
"Todo mensaje que incumpla alguna de las reglas sera eliminado."

Y me pregunto yo, ¿qué diablos te ha pasado para este cambio tan normativo?. En este momento esto parece un Gran Hermano cuando en meses y meses anteriores, sin más intervención tuya que para aclarar conceptos o dudas de nivel, todo ha ido como la seda. ¿Acaso ha cambiado a quién está detrás de las siglas de E.I, o te ha pasado algo a nivel particular?. Pues no, no entiendo el cambio de actitud,

No hay ningun cambio de actitud y podes preguntarte lo que se te de la gana, es irrelevante, que yo ahora tenga mas tiempo para invertir en el foro no implica que lo que ustedes hayan hecho en el pasado no haya violado las reglas. ¿Bien claro, verdad? ¿Vos cambiaste o siempre fuiste asi?

Somos los primero en advertir a los usuarios que no cuelgan nada de código que no se hacen tareas, y a las pruebas me remito. Pero otra cosa es otra cosa, el aprender conceptos  los unos de los otros con las posteriores soluciones aportadas.

No se nota sinceramente.

¿Por qué crees que razón y el mundo está en tu contra?, ya que no somos los únicos advertidos estas días otras, y digo bien, estos días atrás después de meses y meses da bálsamo.

La moderacion es subjetiva, si USTED cree que estoy equivocado y USTED porta la razon, lamento comunicarle que yo creo lo contrario.

No se trata de que leas esto con intención de responder con las reglas, que ya te aclaro y/o contesto y/o reitero que hemos aclarado y/o aprendido conceptos de las sucesivas intervenciones, sino de que pienses como el mundo puede estar equivocado y tu tener la razón.

No se trata de ninguna otra cosa que cumplir la reglas, los que estan equivocados son los que rompen las reglas, no lo entienden y pretender seguir haciendolo.

Y si las normas se han vuelto tan estrictas habría que proponer al dueño de este foro que reconsidere la nueva interpretación de las normas o su cambio.

Las reglas siempre han sido las mismas y en su amplia mayoria fueron establecidas por el staff, que solo haya en efecto un moderador en este subforo y no pueda estar detras de cada violacion del reglamento que se comete no significa que sean permitidas, asi que por favor trata de cumplir las reglas de una vez.

P:D: Me queda una duda:¿durará este post o será borrado por la censura?. Es que tal como has puesto las cosas .........

Lo increible es que tenga que repetir cuales son la reglas y pretendan seguir rompiendolas. No es un tema a discutir. ¿Queres que te pase un pañuelo para secarte las lagrimas censuradas?

Me apunto al segundo punto y lo de abstracto no lo veo por ningún lado, al menos es esta normas particulares.

Desconoces las reglas y no es mi culpa.

"Participar en este subforo implica aceptar las reglas del foro y las de la sección de Programación así que por favor antes de publicar mensajes ténganlas en cuenta. Todo mensaje que incumpla alguna de las reglas sera eliminado."

http://foro.elhacker.net/programacion_cc/reglas_del_subforo-t251603.0.html
http://foro.elhacker.net/programacion_general/reglas_del_foro_iexclleed_todos-t93852.0.html



Repito por ultima vez: no hagan mas tareas ajenas, el tema esta terminado y no lo voy a discutir, ya les pedi por favor mas de una vez, ahora simplemente acaten las reglas y punto.