方法一、
#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版。