开方上下找每个质因数都出现一次的数,很快就能找到。
注意:(LL)sqrt(n)的平方值一般小于n,向上找的起点应该是(LL)sqrt(n)+1。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#include<map>
#include<string>
#define maxn 110000
#define LL long long
using namespace std;
const LL LLONG=(((LL)1<<63)-1);
bool get(int temp)
{
LL i=2;
if(temp<2)
return false;
while(i*i<=temp)
{
int num=0;
while(temp%i==0)
{
temp/=i;
num++;
if(num>1)
return false;
}
i++;
}
return true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL n;
scanf("%lld",&n);
LL temp=(LL)sqrt(n);
LL ans1=-1;
for(LL i=temp;i>1;--i)
{
if(get(i))
{
ans1=i;
break;
}
}
LL ans2=-1;
for(LL i=temp+1;;++i)
{
if(get(i))
{
ans2=i;
// cout<<"ans2=="<<ans2<<endl;
break;
}
}
LL fin;
if(ans1==-1)
{
fin=abs(n-ans2*ans2);
// cout<<"1PP"<<endl;
}
else if(ans2==-1)
{
// cout<<"2PP"<<endl;
fin=abs(n-ans1*ans1);
}
else
fin=min(abs(n-ans2*ans2),abs(n-ans1*ans1));
printf("%lld\n",fin);
}
}