Descomponer numero en factores..

Iniciado por ThePinkPanther, 12 Febrero 2013, 00:52 AM

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

ThePinkPanther

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.

amchacon

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;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ThePinkPanther

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..

amchacon

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
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#4
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!.

ThePinkPanther

#5
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.

amchacon

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};
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

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++?.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

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.

BatchianoISpyxolo

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.
Puede que desees aprender a programar desde 0: www.espascal.es