I think there is a precision problem with the following code:
bool isPerfectSquare(long long n){
long long squareRootN=(long long)(sqrt(n)+0.5);
return
mmmm don't use float/double for your true/false outcome (you'll end up having approximation problems) Much better the integer apporach:
boolean is_square(long long n)
{
long long a=n;
while (a*a>n)
{
a=div(a+div(n,a),2);
}
return a*a==n;
}
div() is the integer division without remainder (you can use GCD() in some ways)
I know, I know... care must be taken for overflow issues