Вы можете использовать метод Ньютона-Ральфсона для реализации квадратного корня для целых чисел самостоятельно. Но для проблемы, о которой вы говорите, я бы рекомендовал вместо этого вычислить квадраты всех целых чисел.
/* Returns the greatest integer that's <= to the square root. */
unsigned int isqrt(unsigned int x)
{
if (x < 4) {
return 1;
} else {
unsigned int try = x / 2;
while ((x / try) < try) {
try = (try + (x / try)) / 2;
}
return try;
}
}
int check_perfect_square(unsigned int x)
{
unsigned int sqrt = isqrt(x);
return (sqrt * sqrt) == x;
}
И, для моего фактического предложенного решения:
unsigned int sum_perfect_squares(unsigned int limit)
{
unsigned int sum = 0;
unsigned int i = 1;
for (i = 1; i * i < limit; ++i) {
sum += i * i;
}
return sum;
}