#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一样,所以只要能够相等就行!。