Test Foro de elhacker.net SMF 2.1

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.


/*
Autor : ThePinkPanther(nick) , nombre : Santiago Díaz
12/02/2013
*/
#include <iostream>
#include <stdlib.h>
using namespace std;


int main()
{
int i=0;
int contador=0;
int *factores=NULL;
int aux=0;
int descomponer=0;



cout<<"Factorizar un numero.."<<endl;
cout<<endl<<"Numero a factorizar : " ; cin>>descomponer;
aux=descomponer;
factores=(int *)calloc(32,sizeof(int));



cout<<endl;
for(i=2;i<=descomponer;i++)
{
while(descomponer%i==0)
{

factores[contador]=i;
contador++;
descomponer=descomponer/i;
};
}

cout<<"########"<<endl;
cout<<aux<<" = " <<" ";
cout<<factores[0];
int x=1;
do
{
cout<<".";
cout<<factores[x];
x++;

}while(factores[x]!=0);
cout<<endl<<"########"<<endl;



free(factores);

}


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 (cpp) [Seleccionar]
factores=(int *)calloc(32,sizeof(int));
...
free(factores);


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

Código (cpp) [Seleccionar]
factores = new int[32];
...
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 (cpp) [Seleccionar]
#include <vector>

vector<tipo> Variable;


Si quieres hacer un vector de enteros:

Código (cpp) [Seleccionar]
vector<int> Variable;

Y para añadir elementos al vector:

Código (cpp) [Seleccionar]
vector<int> Variable;
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 (cpp) [Seleccionar]
Variable.clear(); // Limpiamos los valores
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
Cita de: amchacon en 12 Febrero 2013, 14:54 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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
using namespace std;

int main(){
 int i=0;
 int contador=0;
 int aux=0;
 int descomponer=0;
 int *factores=new int[32];
 for (i=0;i<32;i++)
   factores[i]=0;
  cout <<"Factorizar un numero.."<<endl;
 cout<<endl<<"Numero a factorizar : " ;
  cin>>descomponer;
 aux=descomponer;
 cout<<endl;
 for(i=2;i<=descomponer;i++) {
   while(descomponer%i==0) {
     factores[contador]=i;
     contador++;
     descomponer=descomponer/i;
   }
 }
 cout<<"########"<<endl;
 cout<<aux<<" = " <<" ";
 cout<<factores[0];
 int x=1;
 do{
   cout<<"x";
   cout<<factores[x];
   x++;

 }while(factores[x]!=0);
 cout<<endl<<"########"<<endl;
 delete[] factores;
 return EXIT_SUCCESS;
}


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 (cpp) [Seleccionar]
vector<int> Variable;
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 (cpp) [Seleccionar]
Variable.clear(); // Limpiamos los valores
Variable.resize(0); // Cambiamos su tamaño a 0


gracias voy a tratar de familiarisarme con esto..


Cita de: leosansan en 12 Febrero 2013, 22:23 PM
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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
using namespace std;

int main(){
 int i=0;
 int contador=0;
 int aux=0;
 int descomponer=0;
 int *factores=new int[32];
  for (i=0;i<32;i++)
    factores[i]=0;
  cout <<"Factorizar un numero.."<<endl;
 cout<<endl<<"Numero a factorizar : " ;
 cin>>descomponer;
 aux=descomponer;
 cout<<endl;
 for(i=2;i<=descomponer;i++) {
   while(descomponer%i==0) {
     factores[contador]=i;
     contador++;
     descomponer=descomponer/i;
   }
 }
 cout<<"########"<<endl;
 cout<<aux<<" = " <<" ";
 cout<<factores[0];
 int x=1;
 do{
   cout<<"x";
   cout<<factores[x];
   x++;

 }while(factores[x]!=0);
 cout<<endl<<"########"<<endl;
 delete[] factores;
 return EXIT_SUCCESS;
}


Saluditos!.

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


  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
Cita de: leosansan en 12 Febrero 2013, 22:23 PM¿otra forma más "inmediata" de inicializar factores a cero?
En array estáticos se puede usar esto:

Código (cpp) [Seleccionar]
char Variable[256] = {0};
Título: Re: Descomponer numero en factores..
Publicado por: rir3760 en 13 Febrero 2013, 02:50 AM
Cita de: ThePinkPanther en 12 Febrero 2013, 22:29 PM
Código (cpp) [Seleccionar]
int *factores=new int[32];
for (i=0;i<32;i++)
   factores[i]=0;

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

Código (cpp) [Seleccionar]
for (i=0;i<32;i++)
   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
Cita de: rir3760 en 13 Febrero 2013, 02:50 AM

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 (cpp) [Seleccionar]
int *factores=new int[32]();//con parentesis se inicializan a cero

No siendo necesario:

Código (cpp) [Seleccionar]
for (i=0;i<32;i++)
    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.

CitarIf 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
Cita de: BatchianoISpyxolo en 13 Febrero 2013, 22:43 PM
CitarIf 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
Cita de: rir3760 en 14 Febrero 2013, 02:02 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
Cita de: BatchianoISpyxolo en 14 Febrero 2013, 02:15 AMsi 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:
CitarParagraph 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