Bien, pues he comenzado a descubrir ventajas de Python o que tengo debilidades en C++. Los siguientes programas encuentran números narcisistas, esto es, un número de n dígitos que es la suma de la enésima potencia de sus dígitos (por ejemplo ${407=4^3+0^3+7^3}$ es un 3-narcisista).
En los programas P es el número de dígitos de los narcisistas y ambos programas tardan un tiempo razonable (máx. 1 min) con ${P\leq{7}}$.
C++:
Implementé el programa de este modo porque no pude hacerlo de modo más sencillo, como lo hice con Python. En Python el programa simplemente aumenta número por número y digamos que “desmiembra” dígito por dígito, a partir de un entero. Aquí simplemente no pude hacerlo; intenté convertir todo el entero a cadena y convertir caracter por caracter a entero. No funcionó. Así limpiara el arreglo original, usara punteros o memoria dinámica. Y bueno, el código que muestro sólo tiene de más la función "potencia", pero me quise ahorrar el problema de meter una variable double y hacer de más malabares para no tener problemas. También es notable el que haya usado recursión en la función "look" porque aún me cuesta bastante usar esta forma de programación. Aunque el resultado me parece elegante, fue bastante difícil lograrlo; el algoritmo no es inmediato y la recursividad, aunque ahorra fácilmente 5 o más líneas de declaraciones e intercambios, me resulta muy complicada para lo que busco que haga el programa.
En cambio véase con qué facilidad se codifica en Python:
Ya todo lo he descrito y el programa habla por sí solo con su sencillez. Lo único que me pareció inconveniente, y aún no me lo explico del todo, es que tardó mucho más la ejecución que con C++.
En fin, ¡a seguir descubriendo Python y a afinarnos en C++ se ha dicho!
En los programas P es el número de dígitos de los narcisistas y ambos programas tardan un tiempo razonable (máx. 1 min) con ${P\leq{7}}$.
C++:
long int potencia (int,int);
long int look (int);
#define P 7
int main(void)
{
cout << "Numeros " << P << "-narcisistas:" << endl;
for(int i=potencia(10,P-1); i<potencia(10,P); i++)
{
if(look(i)==i){cout << i << endl;}
}
cout << endl << "Clic para finalizar" << endl;
getch();
return 0;
}
long int potencia(int a, int b)
{
if(b>0) return a*potencia(a, b-1);
else return 1;
}
long int look (int i)
{
if (i>9) { return look(i/10)+look(i%10);}
else { return potencia(i%10,P);}
}
Implementé el programa de este modo porque no pude hacerlo de modo más sencillo, como lo hice con Python. En Python el programa simplemente aumenta número por número y digamos que “desmiembra” dígito por dígito, a partir de un entero. Aquí simplemente no pude hacerlo; intenté convertir todo el entero a cadena y convertir caracter por caracter a entero. No funcionó. Así limpiara el arreglo original, usara punteros o memoria dinámica. Y bueno, el código que muestro sólo tiene de más la función "potencia", pero me quise ahorrar el problema de meter una variable double y hacer de más malabares para no tener problemas. También es notable el que haya usado recursión en la función "look" porque aún me cuesta bastante usar esta forma de programación. Aunque el resultado me parece elegante, fue bastante difícil lograrlo; el algoritmo no es inmediato y la recursividad, aunque ahorra fácilmente 5 o más líneas de declaraciones e intercambios, me resulta muy complicada para lo que busco que haga el programa.
En cambio véase con qué facilidad se codifica en Python:
t,P = 0,7
print "Numeros ",P,"- narcisistas:"
for i in range(10**(P-1), 10**P):
for j in str(i):
t += int(j)**P
if t == i:
print t
t=0
Ya todo lo he descrito y el programa habla por sí solo con su sencillez. Lo único que me pareció inconveniente, y aún no me lo explico del todo, es que tardó mucho más la ejecución que con C++.
En fin, ¡a seguir descubriendo Python y a afinarnos en C++ se ha dicho!
No comments:
Post a Comment