Я не знаю, опаздываю ли я, но я оставлю это здесь, чтобы помочь кому-то в будущем.
Мы используем квадратный корень из (n), то есть int (n ** 0,5), чтобы уменьшить диапазон чисел, которые ваша программа будет вынуждена вычислять.
Например, мы можем выполнить пробное деление, чтобы проверить правильность 100. Давайте посмотрим на все делители 100:
2, 4, 5, 10, 20, 25, 50 Здесь мы видим, что наибольший коэффициент равен 100/2 = 50. Это верно для всех n: все делители меньше или равны n / 2. Если мы более подробно рассмотрим дивизоров, мы увидим, что некоторые из них являются избыточными. Если мы будем писать список по-разному:
100 = 2 × 50 = 4 × 25 = 5 × 20 = 10 × 10 = 20 × 5 = 25 × 4 = 50 × 2 избыточность становится очевидной. Как только мы достигнем 10, что составляет √100, делители просто поворачиваются и повторяются. Поэтому мы можем дополнительно исключить тестовые делители, превышающие √n.
Возьмем другое число, например 16.
Его делители равны 2,4,8
16 = 2 * 8, 4 * 4, 8 * 2.
Вы можете заметить, что после достижения 4, являющегося квадратным корнем из 16, мы повторили 8 * 2, которые мы уже сделали как 2 * 8 , Этот шаблон верен для всех чисел.
Чтобы избежать повторения, мы, таким образом, проверяем на соответствие с квадратным корнем числа n.
Итак, мы преобразуем квадратный корень в int потому что нам не нужен диапазон с плавающими числами.
Прочтите тест прочности на wikipedia для получения дополнительной информации.
CharBuffer.wrap(char[], int, int)
:
Его резервный массив будет заданным массивом, а смещение массива будет равно нулю.
Изучая записи в CharBuffer.offset
, похоже, что HeapCharBuffer и StringCharBuffer могут иметь ненулевые arrayOffsets().
Вы можете использовать позицию
для достижения аналогичных результатов, я думаю. Не используйте перемотку
, поскольку она устанавливает позицию
в 0; вместо этого используйте сброс
.