myślę podejście brute force powinno działać: spróbować wszystkich e
s od 2 (1 rozwiązanie jest trywialne) i do góry, biorąc r = n^1/e
, a double
. Jeśli r
ma mniej niż 2, zatrzymaj się. W przeciwnym razie, obliczyć ceil(r)^e
i floor(r)^e
i porównać je z n
(potrzebujesz ceil
i floor
, aby zrekompensować błędy w reprezentacjach zmiennoprzecinkowych). Zakładając, że twoje liczby całkowite mieszczą się w 64 bitach, nie musisz wypróbowywać więcej niż 64 wartości e
.
Oto przykład w 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;
}
Wywołany z 65536, produkuje ten wyjściowe:
65536, 1
256, 2
16, 4
4, 8
2, 16
Czy 'e' musi być liczbą całkowitą? – huitseeker
Przepraszam, że zapomniałem o tym wspomnieć, zaktualizowałem to pytanie. – Gautam
Wciąż szukam czegoś. robiliśmy to przez ponad 45 minut. – Gautam