Помимо ускорения @ spatulamania, вы можете использовать арифметику по модулю для дальнейшего ускорения проверок.
Чтобы проверить каждый идеальный квадрат, вам нужно разделить число на две части, сложить их, возвести в квадрат сумму и сравнить ее с исходным числом. (Я назову это как "полная проверка")
Вместо этого вы можете сначала проверить только последние цифры двух частей (и возвести в квадрат их сумму). Например, для числа 99980001
возьмите цифры 8
и 1
, возьмите квадрат (8+1)^2 = 9^2 = 81
и проверьте, что последняя цифра (1
в данном случае) совпадает с последней цифрой 99980001
(Я назову это как «мелкий чек»). Если да, перейдите к полной проверке.
Поскольку таких комбинаций всего 10х10 = 100, это нужно сделать один раз. Вы создадите массив допустимых комбинаций, которые вы можете использовать:
0 0
0 1
8 1
4 4
8 4
0 5
0 6
8 6
4 9
8 9
Используя это, вам нужно будет сделать только "маленькую проверку" для примерно 82% совершенных квадратов (те, которые не проходят проверку маленькой) и обе проверки для остальных 18% (которые проходят маленькую проверку). проверьте, так что "полная проверка" тоже понадобится). Поэтому, если «маленькая проверка» может быть выполнена достаточно быстро, вы получите некоторую скорость.
Вы можете найти еще быстрее расширить эту таблицу для последних 2 цифр двух частей и использовать ее (когда n достаточно велико).