直接暴力查找。注意负数的存在! #include<iostream> #include<math.h> #include<string> using namespace std; __int64 n; #define esp 1e-10 int result() { int star=2,end=(int )sqrt((double)n); for(int i=star;i<=end;i++) { if(n%i>=esp) continue; __int64 k=n;int res=0; while(k%i<esp) { k/=i; res++; } if(k==1) return res; } return 1; } int result2() { __int64 w=-1*n; int star=2,end=(int )sqrt((double)w); for(int i=star;i<=end;i++) { if(n%i>=esp) continue; __int64 k=w;int res=0; while(k%i<esp) { k/=i; res++; } if(k==1&&res%2!=0) return res; } return 1; } int main() { while(1) { cin>>n; if(n==0) break; int res; if(n>0) res=result(); else res=result2(); cout<<res<<endl; } return 0; }