
































































貌似pow()函數(shù)比log()快。之前用log()函數(shù)枚舉對數(shù)的底,超時。
對輸入要分正負(fù)。枚舉的范圍是[1,log((double)n)/log(2.0000000)+1]。
當(dāng)x為正數(shù)時,p取以上區(qū)間所有整數(shù),在符合的p中取最大。
當(dāng)x為負(fù)數(shù)時,將x轉(zhuǎn)化為正數(shù)處理,p取以上區(qū)間所有奇數(shù)(因為只有奇數(shù)次冪才可能等于負(fù)數(shù)),
在符合的p中取最大。
不懂創(chuàng)新,中國的未來堪憂啊
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2011年6月5日, 下午1:15
*/
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
long long n;
while (cin >> n) {
int flag[1000] = {0};
if (n == 0)
break;
else if (n < 0) {
n = -n;
long long k = n;
int count = 0;
int p = 1;
for (int i = 2; (i <= sqrt(k) + 1) && (i < k); i++) {
while (k % i == 0) {
flag[count]++;
k = k / i;
}
if (k != n) {
count++;
}
}
if (k != 1) {
cout << p << endl;
} else {
if (count == 1 || count == 0) {
while (flag[0] % 2 == 0) {
flag[0] = flag[0] / 2;
}
cout << flag[0] << endl;
} else {
for (p = flag[0];; p--) {
if (p % 2 == 0) {
p--;
}
int m = 0;
while (flag[m] % p == 0 && m < count) {
m++;
}
if (m == count) {
cout << p << endl;
break;
}
}
}
}
}
else if (n > 0) {
long k = n;
int count = 0;
int p = 1;
for (int i = 2; (i <= sqrt(k) + 1) && (i < k); i++) {
while (k % i == 0) {
flag[count]++;
k = k / i;
}
if (k != n) {
count++;
}
}
if (k != 1) {
cout << p << endl;
} else {
if (count == 1 || count == 0) {
cout << flag[0] << endl;
} else {
for (p = flag[0];; p--) {
int m = 0;
while (flag[m] % p == 0 && m < count) {
m++;
}
if (m == count) {
cout << p << endl;
break;
}
}
}
}
}
}
return 0;
}