给出一个数x,找出2 - x中一个数b, 使得x = b ^ p中p最大。
枚举2 - sqrt(x), 如果x小于零则要判断p是不是奇数, 如果x是偶数只需要枚举2, 4, 6, 8...; 如果是奇数则枚举3, 5, 7, 9...。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
int main() {
#ifndef ONLINE_JUDGE
freopen("test", "r", stdin);
freopen("my", "w", stdout);
#endif // ONLINE_JUDGE
long long n;
while(scanf("%lld", &n)&& n) {
bool neg = false;
long long i, best_cnt = 1;
if(n < 0) {
neg = true;
n = -n;
}
if(n & 1) i = 3;
else i = 2;
for(; i * i <= n; i += 2) {
long long cnt = 0, k = n;
while(!(k % i)) {
cnt++;
k /= i;
}
if(k == 1&&cnt > best_cnt) {
if(!neg)
best_cnt = cnt;
else if(cnt & 1) best_cnt = cnt;
}
}
printf("%lld\n", best_cnt);
}
return 0;
}