Tôi nghĩ rằng cách tiếp cận sức mạnh vũ phu nên làm việc: thử tất cả e
s từ 2 (1 là một giải pháp tầm thường) trở lên, lấy r = n^1/e
, một double
. Nếu r
nhỏ hơn 2, hãy dừng lại. Nếu không, hãy tính ceil(r)^e
và floor(r)^e
và so sánh chúng với n
(bạn cần ceil
và floor
để bù đắp lỗi trong biểu diễn điểm nổi). Giả sử các số nguyên của bạn phù hợp với 64 bit, bạn sẽ không cần thử nhiều hơn 64 giá trị của e
.
Dưới đây là một ví dụ trong 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;
}
Khi gọi với 65536, nó tạo ra sản lượng này:
65536, 1
256, 2
16, 4
4, 8
2, 16
'e' có phải là số nguyên không? – huitseeker
Xin lỗi tôi quên đề cập đến điều đó, tôi đã cập nhật câu hỏi – Gautam
Tôi vẫn đang tìm kiếm thứ gì đó. đã làm điều đó trong hơn 45 phút – Gautam