Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ThePinkPanther en 12 Febrero 2013, 00:52 am



Título: Descomponer numero en factores..
Publicado por: ThePinkPanther en 12 Febrero 2013, 00:52 am
Hola,acá les traigo un programa que hice hace unas semanas atras, la verdad es que tiene pocas lineas de código ,pero es funcional ,para los que trabajen con las matemáticas y necesitan descomponer un numero en factores,tal vez se les resulte aburrido andar dividiéndolo , hace poco cuando estaba estudiando matemáticas me sirvió,quisas a alguien le sirva.

Código
  1. /*
  2. Autor : ThePinkPanther(nick) , nombre : Santiago Díaz
  3. 12/02/2013
  4. */
  5. #include <iostream>
  6. #include <stdlib.h>
  7. using namespace std;
  8.  
  9.  
  10. int main()
  11. {
  12. int i=0;
  13. int contador=0;
  14. int *factores=NULL;
  15. int aux=0;
  16. int descomponer=0;
  17.  
  18.  
  19.  
  20. cout<<"Factorizar un numero.."<<endl;
  21. cout<<endl<<"Numero a factorizar : " ; cin>>descomponer;
  22. aux=descomponer;
  23. factores=(int *)calloc(32,sizeof(int));
  24.  
  25.  
  26.  
  27. cout<<endl;
  28. for(i=2;i<=descomponer;i++)
  29. {
  30. while(descomponer%i==0)
  31. {
  32.  
  33. factores[contador]=i;
  34. contador++;
  35. descomponer=descomponer/i;
  36. };
  37. }
  38.  
  39. cout<<"########"<<endl;
  40. cout<<aux<<" = " <<" ";
  41. cout<<factores[0];
  42. int x=1;
  43. do
  44. {
  45. cout<<".";
  46. cout<<factores[x];
  47. x++;
  48.  
  49. }while(factores[x]!=0);
  50. cout<<endl<<"########"<<endl;
  51.  
  52.  
  53.  
  54. free(factores);
  55.  
  56. }
  57.  

Ejemplo entrada : 8
Salida : 2.2.2 , que esto es .. base 2 potencia 3.

Saludos.


Título: Re: Descomponer numero en factores..
Publicado por: amchacon en 12 Febrero 2013, 14:54 pm
Código
  1. factores=(int *)calloc(32,sizeof(int));
  2. ...
  3. free(factores);

Porque usas funciones de C? Sería más apropiado usar los new y delete:

Código
  1. factores = new int[32];
  2. ...
  3. delete[] factores;


Título: Re: Descomponer numero en factores..
Publicado por: ThePinkPanther en 12 Febrero 2013, 18:44 pm
Quisas tengas razón , pero recien empiezo con c++ me pase de ansi a c++ , por lo que se que los operadores new y delete me permiten reservar memoria dinamica y liberarla, pero estoy acostumbrado a usar calloc o malloc porque con realloc puedo hacer una reasignación, en c++ no se como seria una reasignacion de memoria..


Título: Re: Descomponer numero en factores..
Publicado por: amchacon en 12 Febrero 2013, 20:59 pm
Para reasignaciones de memoria lo mejor es usar la clase vector:

Código
  1. #include <vector>
  2.  
  3. vector<tipo> Variable;

Si quieres hacer un vector de enteros:

Código
  1. vector<int> Variable;

Y para añadir elementos al vector:

Código
  1. vector<int> Variable;
  2. Variable.push_back(1); // Añade un elemento nuevo

Luego hay más funciones internas (busqueda, obtener tamaño del vector...). Las puedes consultar aquí:
http://www.cplusplus.com/reference/vector/vector/

No es necesario borrar el vector, puesto que se borra solo cuando termina su ambito. Aunque si eres un esceptico lo puedes hacer explicitamente:

Código
  1. Variable.clear(); // Limpiamos los valores
  2. Variable.resize(0); // Cambiamos su tamaño a 0


Título: Re: Descomponer numero en factores..
Publicado por: leosansan en 12 Febrero 2013, 22:23 pm

Porque usas funciones de C? Sería más apropiado usar los new y delete:


Como yo también soy nuevo en esto del C++, planteo una dudita; ¿otra forma más "inmediata" de inicializar factores a cero?:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main(){
  6.  int i=0;
  7.  int contador=0;
  8.  int aux=0;
  9.  int descomponer=0;
  10.  int *factores=new int[32];
  11.  for (i=0;i<32;i++)
  12.    factores[i]=0;
  13.   cout <<"Factorizar un numero.."<<endl;
  14.  cout<<endl<<"Numero a factorizar : " ;
  15.  cin>>descomponer;
  16.  aux=descomponer;
  17.  cout<<endl;
  18.  for(i=2;i<=descomponer;i++) {
  19.    while(descomponer%i==0) {
  20.      factores[contador]=i;
  21.      contador++;
  22.      descomponer=descomponer/i;
  23.    }
  24.  }
  25.  cout<<"########"<<endl;
  26.  cout<<aux<<" = " <<" ";
  27.  cout<<factores[0];
  28.  int x=1;
  29.  do{
  30.    cout<<"x";
  31.    cout<<factores[x];
  32.    x++;
  33.  
  34.  }while(factores[x]!=0);
  35.  cout<<endl<<"########"<<endl;
  36.  delete[] factores;
  37.  return EXIT_SUCCESS;
  38. }
  39.  

Saluditos!.


Título: Re: Descomponer numero en factores..
Publicado por: ThePinkPanther en 12 Febrero 2013, 22:29 pm
Yo usaba la funcion calloc de c.
que automaticamente la memoria reservada es inicializada a 0 .
ahora pruebo con new.

Citar

Y para añadir elementos al vector:

Código
  1. vector<int> Variable;
  2. Variable.push_back(1); // Añade un elemento nuevo

Luego hay más funciones internas (busqueda, obtener tamaño del vector...). Las puedes consultar aquí:
http://www.cplusplus.com/reference/vector/vector/

No es necesario borrar el vector, puesto que se borra solo cuando termina su ambito. Aunque si eres un esceptico lo puedes hacer explicitamente:

Código
  1. Variable.clear(); // Limpiamos los valores
  2. Variable.resize(0); // Cambiamos su tamaño a 0

gracias voy a tratar de familiarisarme con esto..


Como yo también soy nuevo en esto del C++, planteo una dudita; ¿otra forma más "inmediata" de inicializar factores a cero?:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main(){
  6.  int i=0;
  7.  int contador=0;
  8.  int aux=0;
  9.  int descomponer=0;
  10.  int *factores=new int[32];
  11.  for (i=0;i<32;i++)
  12.    factores[i]=0;
  13.   cout <<"Factorizar un numero.."<<endl;
  14.  cout<<endl<<"Numero a factorizar : " ;
  15.  cin>>descomponer;
  16.  aux=descomponer;
  17.  cout<<endl;
  18.  for(i=2;i<=descomponer;i++) {
  19.    while(descomponer%i==0) {
  20.      factores[contador]=i;
  21.      contador++;
  22.      descomponer=descomponer/i;
  23.    }
  24.  }
  25.  cout<<"########"<<endl;
  26.  cout<<aux<<" = " <<" ";
  27.  cout<<factores[0];
  28.  int x=1;
  29.  do{
  30.    cout<<"x";
  31.    cout<<factores[x];
  32.    x++;
  33.  
  34.  }while(factores[x]!=0);
  35.  cout<<endl<<"########"<<endl;
  36.  delete[] factores;
  37.  return EXIT_SUCCESS;
  38. }
  39.  

Saluditos!.

Segun mis pruebas, cuando usas new , la memoria ya es inicializada en 0. un saludo.

Código:
  for (i=0;i<32;i++)
    factores[i]=0;

no es necesario.


Título: Re: Descomponer numero en factores..
Publicado por: amchacon en 12 Febrero 2013, 23:44 pm
¿otra forma más "inmediata" de inicializar factores a cero?
En array estáticos se puede usar esto:

Código
  1. char Variable[256] = {0};


Título: Re: Descomponer numero en factores..
Publicado por: rir3760 en 13 Febrero 2013, 02:50 am
Código
  1. int *factores=new int[32];
  2. for (i=0;i<32;i++)
  3.   factores[i]=0;
Segun mis pruebas, cuando usas new , la memoria ya es inicializada en 0.

Código
  1. for (i=0;i<32;i++)
  2.   factores[i]=0;
no es necesario.
Es necesario (en ese caso) ya que el valor inicial de cada elemento depende de su tipo.

Una discusión algo técnica (y en ingles) donde se explica el porque y se da una alternativa es Is new int[10]() valid c++? (http://stackoverflow.com/questions/2468367/is-new-int10-valid-c).

Un saludo


Título: Re: Descomponer numero en factores..
Publicado por: leosansan en 13 Febrero 2013, 19:55 pm

Una discusión algo técnica (y en ingles) donde se explica el porque y se da una alternativa es


En resumen, con paréntesis al final se inicializan a cero, comprobado:

Código
  1. int *factores=new int[32]();//con parentesis se inicializan a cero

No siendo necesario:

Código
  1. for (i=0;i<32;i++)
  2.    factores[i]=0;

Saluditos!.
 . .... y gracias n-ésimas amigo rir.


Título: Re: Descomponer numero en factores..
Publicado por: BatchianoISpyxolo en 13 Febrero 2013, 22:43 pm
Al colocar los paréntesis lo que haces es llamar al constructor por defecto. Es decir que si hay constructor predeterminado o definido por el usuario, vamos a poder inicializar la variable a la hora de declararla.

Citar
If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.


Título: Re: Descomponer numero en factores..
Publicado por: rir3760 en 14 Febrero 2013, 02:02 am
Citar
If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.
No entiendo el sentido de la cita. ¿Puedes aclararlo por favor?

Un saludo


Título: Re: Descomponer numero en factores..
Publicado por: BatchianoISpyxolo en 14 Febrero 2013, 02:15 am

No entiendo el sentido de la cita. ¿Puedes aclararlo por favor?

Un saludo

A mi entender, es que si tienes estructuras o clases básicas (PODS), éstos carecen de inicializadores y, por tanto, el programa está mal formado.


Título: Re: Descomponer numero en factores..
Publicado por: rir3760 en 14 Febrero 2013, 03:43 am
si tienes estructuras o clases básicas (PODS), éstos carecen de inicializadores y, por tanto, el programa está mal formado.
No. Si revisamos el tema que mencione con cuidado:
Citar
Paragraph 5.3.4/15 states that

A new-expression that creates an object of type T initializes that object as follows:

[...]

* If the new-initializer is of the form (), the item is value-initialized (8.5)

where value initialized for POD means zero-initialize
.

[...]

If the new-initializer is omitted:

* If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-initialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.

* Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;

En resumen:

* Si se utiliza el inicializador "()" en el caso de PODs su resultado es la asignación del valor 0.

* Si se omite el inicializador el valor almacenado es no determinado.

"ill-formed" solo aplica si 1) Se omite el inicializador y 2) el objeto esta calificado (directa o indirectamente) con el calificador const.

Un saludo


Título: Re: Descomponer numero en factores..
Publicado por: 85 en 21 Febrero 2013, 01:12 am
me acuerdo que yo había usado una lógica parecida anteriormente..

http://foro.elhacker.net/programacion_cc/atoi_itoa_personalizadas-t358459.0.html;msg1734670#msg1734670

http://foro.elhacker.net/programacion_cc/aportacion_programas_en_c_basicos-t365766.0.html;msg1769441#msg1769441