Creo que el enfoque de fuerza bruta debería funcionar: pruebe todos e
s de 2 (1 es una solución trivial) y más, tomando r = n^1/e
, double
. Si r
es menor que 2, deténgase. De lo contrario, calcule ceil(r)^e
y floor(r)^e
, y compárelos con n
(necesita ceil
y floor
para compensar los errores en las representaciones de coma flotante). Suponiendo que sus enteros encajen en 64 bits, no necesitaría probar más de 64 valores de e
.
Aquí se muestra un ejemplo en C++:
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>
typedef long long i64;
using namespace std;
int main(int argc, const char* argv[]) {
if (argc == 0) return 0;
stringstream ss(argv[1]);
i64 n;
ss >> n;
cout << n << ", " << 1 << endl;
for (int e = 2 ; ; e++) {
double r = pow(n, 1.0/e);
if (r < 1.9) break;
i64 c = ceil(r);
i64 f = floor(r);
i64 p1 = 1, p2 = 1;
for (int i = 0 ; i != e ; i++, p1 *= c, p2 *= f);
if (p1 == n) {
cout << c << ", " << e << endl;
} else if (p2 == n) {
cout << f << ", " << e << endl;
}
}
return 0;
}
Cuando se invoca con 65536, que produce este resultado:
65536, 1
256, 2
16, 4
4, 8
2, 16
¿'' e' tiene que ser un número entero? – huitseeker
Lo siento, me olvidé de mencionar que he actualizado la pregunta – Gautam
Todavía estoy buscando algo. estado haciendo eso durante más de 45 minutos – Gautam