Что можно сделать лучше, быстрее?
Поменять алгоритм на метод деления пополам или побитовый поиск, с уменьшением сложности по количеству бит в int с экспоненциальной до линейной.
Например так:
int my_sqr(int number){
register unsigned int temp, x;
if (number < 0)
number = -number;
for (temp = 0, x = 1u << (sizeof(unsigned int) * 4 - 1); x; x >>= 1) {
if ((temp | x) * (temp | x) <= number)
temp |= x;
}
return temp;
}
Не проверять на равенство if (temp == x), потому что равенства может не быть, например для number = 6.
Убедиться, что функция всегда что-то возвращает. Так, например, при number = 6 ваша функция зацикливается или падает с делением на 0, а при number = 0 завершается с неопределённым значением.