题意:对于整数x,如果存在整数b使得x=b^p,则x是一个完全p次方数。输入整数n,求出最大的p,使得n是完全p次方数。n绝对值d至少是2,在int范围内。
思路:唯一分解定理。先考虑正数的情况,将n分解为若干个素数的若干次幂的积,答案就是最小的非零指数。如果输入是负数,取绝对值分解,答案如果是偶数,就除以2,除到奇数为止。因为负数的偶次方是得不到负数的。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include<time.h>
#define INF 1000000
using namespace std;
bool vis[50000];
long long primes[5140];
int main(){
memset(vis,0,sizeof(vis));
vis[0]=vis[1]=true;
for(int i=2;i<=223;i++){
for(int j=i*i;j<50000;j+=i){
vis[j]=true;
}
}
int cnt=0;
for(int i=1;i<50000;i++){
if(!vis[i])primes[++cnt]=i;
}
int a;
while(cin>>a){
if(!a)break;
bool flag=a>0;
a=abs(a);
int ans=INF;
for(int i=1;i<=cnt;i++){
int time=0;
while(!(a%primes[i])){
a/=primes[i];
time++;
}
if(time){
ans=min(ans,time);
}
}
if(a>1){
cout<<1<<endl;
}else{
if(!flag){
while(!(ans%2)){
ans/=2;
}
}
cout<<ans<<endl;
}
}
return 0;
}