方法一、
#include <bits/stdc++.h>
using namespace std;
int ksm(int i,int j)
{
int sum=1;
while(j)
{
if(j&1)
{
sum=sum*i;
}
i=i*i;
j>>=1;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,j;
scanf("%d",&n);
int f=0;
for(i=2;i<31622;i++)
{
for(j=2;j<=32;j++)
{
if(ksm(i,j)==n)
{
f=1;
break;
}
}
if(f)
break;
}
if(f)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
//(关于快速幂的)知识补充:
//1. j&1表示取j为二进制时的最后一位。
//例如:j=5,它的二进制数是101,取最后一位即为1.
//2. j>>=1;表示二进制后移一位。
//例如:j=5,它的二进制数是101,后移一位即为010,然后换为十进制就是2.
// j=6,它的二进制数是110,后移一位即为011,然后换为十进制就是3.
//方法二、
#include<bits/stdc++.h>
using namespace std;
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
int i,j,f,flag,maxn;
scanf("%d",&n);
flag=0;
maxn=32;
for(i=2; i<=sqrt(n); i++)
{
for(j=2; j<=maxn; j++)
{
f=pow(i,j);
if(f==n)
{
flag=1;
break;
}
if(f>n)
{
maxn=j;
break;
}
}
}
if(flag==1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}
// 这种解题的方法非常巧妙:
// 举例说明:当n=31的时候,如果你已经循环到2的5次方了,j 再往后找一定找不到 n,所以一定是3 的多少次方
//这时你应该修改 j 的上限,2的5次方已经比 n 大了,3 的 5 次方可定更大,所以无需循环到 32,到 5 即可。
// 方法三、
#include <bits/stdc++.h>
using namespace std;
int ksm(int i,int j)
{
int sum=1;
while(j)
{
if(j%2)
{
sum=sum*i;
}
i=i*i;
j=j/2;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,j;
scanf("%d",&n);
int f=0;
for(i=2;i<31622;i++)
{
for(j=2;j<=32;j++)
{
if(ksm(i,j)==n)
{
f=1;
break;
}
}
if(f)
break;
}
if(f)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
//方法一的easy版。