33,008
社区成员
发帖
与我相关
我的任务
分享
map<int,pair<int,int>> m;
for(int i=2;i<65536;i++)
{
int c = i;
for(int j=1;c<=INT_MAX/i;j++,c*=i)
m[c] = make_pair(i,j);
}
然后直接查表……
#include <iostream>
#include <math.h>
using namespace std;
//位运算的除法
int Dev(int n,int i)//O(lgn)
{
int ans=0,bit=0;
while((n>>bit)>=1)bit++;//O(lgn)
for (int j=bit;j>=0;j--)//O(lgn)
{
if ((n>>j)>=i)
{
ans+=(1<<j);
n-=(i<<j);
}
}
return ans;
}
//求对数
int Log(int n,int i)//以i为底的n的对数
{//O(lgnlgn)=O(β^2)
int temp=0;
while (n>1)//O(lgn)
{
n=Dev(n,i);//O(lgn)
temp++;
}
return temp;
}
void main()
{
double n=31*31*31,flag=1;
int t=0;
for (int i=2;i<=Log(n,2)+1;i++)//O(lgn)
{
double p=fabs(pow(n,1.0/i)-(int)pow(n,1.0/i));
if (p>0.5) t=(int)pow(n,1.0/i)+1;//类似四舍五入
else t=pow(n,1.0/i);
if (pow(t,i)==n)
{
cout<<n<<"是非平凡幂,存在一个整数"<<pow(n,1.0/i)<<"它的"<<i<<"次幂="<<n<<endl;
flag=0;
//break;
}
}
if (flag)
{
cout<<"n="<<n<<"不存在非平凡幂"<<endl;
}
}