#include <iostream>
#include<cmath>
using namespace std;
int main() {
int t;
cin>>t;
long long b,d;
for(int i=1;i<=t;i++)
{
cin>>b;
d=sqrt(b);
if(d*d==b)
{
cout<<"YES\n";
}
else cout<<"NO\n";
}
}
这道题吧我一开始也写错了,但是思路还是正确的,只是对于实际处理上出了点问题;
pro1:我没注意到b的范围是1e18,所以我一开始没开long long,就导致内存不够
pro2:我头一次才知道pow函数是有精度问题的,所以平方干脆就用d*d,别用pow(d,2);
pro3:我也是确实没想到,如果用double去存sqrt(b)的话,因为b很大接近于1e18的时候,会导致double 丢失精度,所以会容易出现误判,所以最好的方法就是用long long(整数)去存sqrt(b),如果是完全平方数的话就是一个整数,否则的话就会强行截断:
就好比sqrt(3)=1一样,所以只要能够相等就行!。

京公网安备 11010502036488号