Ваша задача - вычислить квадратный корень из натурального числа без использования математических операторов для изменения числа, например:
- Установка переменной (например, squareRoot = 5)
- Дополнение (A + B)
- Вычитание (АБ)
- Умножение (A * B)
- Отдел (A / B)
- Квадрат, куб, четвертый и т. Д. Корни
- Экспоненты
Операторы сравнения (такие как <,>, == и т. Д.) Не считаются «математическими операторами» для целей этого вопроса и допускаются, если они не изменяют значение переменной.
Единственный оператор, который вы можете использовать - это ++. Имеются следующие исключения:
- При желании вы можете инициализировать переменную, установив ее в 0.
- Если ваш язык не включает синтаксис ++, вы можете использовать эквивалентный синтаксис, такой как foo + = 1 или foo = foo + 1
- Квадратный корень должен быть рассчитан по крайней мере на 6 цифр после десятичной точки (место в сто тысяч) и выведен как целое число десятичных дробей (например, если я введу 2, оно может выйти как 14142135624 или 1414213 в зависимости от округления) , Округление вверх или вниз не важно.
Пользовательские функции не допускаются. Кроме того, моделирование функций с помощью goto также не допускается.
Мне интересно посмотреть, что все представляют! Удачного кодирования!
ПОЯСНЕНИЯ
Уточните, что число является положительным целым числом. Вы можете сделать код, который будет делать любое число, но это не обязательно.
РАЗЪЯСНЕНИЕ № 2
Уточнить, что операторы сравнения разрешены.
РАЗЪЯСНЕНИЕ № 3
Сложение, вычитание, умножение, деление и функции на номера изменения не допускаются на всех , независимо от того, являются ли они сохраняются в переменной или нет. Я сожалею, что это делает недействительными пару существующих ответов, но я хотел определить эту группу операторов с помощью «изменить число», чтобы предотвратить ответы троллей (например, я только использовал функцию sqrt (), вы только запретили добавление, умножение, деление и вычитание). Извините за путаницу.
РАЗЪЯСНЕНИЕ № 4
Уточните, что нам нужно как минимум 5 цифр. 10 цифр заставили код работать долго.
источник
while r*r<n*10e20:r+=1
- довольно тривиальна. Кроме того, вы можете рассмотреть вопрос о снижении требуемой производительности до 10 ^ 8 или около того. Во-первых, потому что 10 ^ 10 больше, чем 2 ^ 31, а во-вторых, потому что потребуется некоторое время, чтобы увеличить этот максимум.Ответы:
Python 66
Выход
источник
int(...*1e10)
противном случае очень приятно. Хотя принятиеabs
комплексного значения более или менееsqrt
замаскировано.*1e10
...Python, 184 символа
Следующее решение Python использует только оператор приращения и никаких других арифметических операторов вообще. Однако с требуемой точностью (10 цифр) запуск занимает невероятно много времени. Вы можете проверить это с меньшей точностью (3 цифры), уменьшив
1e20
до1e6
.Ungolfed:
источник
Фортран 73
Можно было бы найти ответ, чтобы на самом деле определить ответ для определенных значений, но это сработает наверняка. Хотя я использую
*
и-
, они не меняют никаких значений , толькоs=s+1
фактически что-то меняет.источник
*
оператор, который довольно явно не разрешен. Или я как-то неправильно понимаю данные ограничения?*
оператор для изменения числа, вы просто нигде не сохраняете результат. Если ОП хотел просто запретить присваивания (кромеs=s+1
), то зачем упоминать все запрещенные арифметические операторы?CJam, 26 байтов
Попробуйте онлайн. Вставьте код , введите желаемое число в поле ввода и нажмите « Выполнить» . Прежде чем сделать, я предлагаю перейти
1e10
на1e4
хотя.В интерпретатор Java ручки
1e6
с входом «2» примерно за 15 секунд.1e20
потребуется огромное количество оперативной памяти.Примеры
Фон
Так как математические операторы не могут изменять числа, мы будем использовать пошаговые операторы для изменения массивов.
Код начинается с «умножения» ввода («i») на 1e20, но без какого-либо фактического умножения. Вместо этого мы помещаем массив, содержащий целые числа «i», массив, содержащий 1e20 целых чисел, берем их декартово произведение и вычисляем его длину.
Затем мы нажимаем ноль и увеличиваем до тех пор, пока произведение целого числа на себя (рассчитанное, как указано выше) не станет меньше, чем
i * 1e20
. Это приводит к округлению квадратного корня.Как это устроено
источник
Кобра - 62
Опубликовано до третьего редактирования, больше не действует.
Он не только короткий, но и не должен быть переполнен, если
n < Decimal.maxValue
источник
r/e*r/e
, что явно не++
математический оператор ...Скала, 117
Не заканчивается в разумные сроки, даже для 2 в качестве ввода, но это работает. Вы можете заметить, что я делаю
_+_
, но это только добавляет 1, и у Scala все равно нет++
оператора. Я мог бы сохранить два символа, заменив внутренний поток списком, но тогда ему не хватило бы памяти. Как написано, я думаю, что это масштабируется только во время обработки, а не использования памяти.источник
Haskell, 70 байт
f
дает целочисленный квадратный корень, находя наибольшее число, квадрат которого меньше или равен входному значению. Функция возведения в квадратs i
увеличивается на единицу для каждого элемента(i,i)
матрицы. (Напечатано на телефоне, поэтому может иметь опечатки).источник
PHP, 124 байта
Это исчерпывающий алгоритм. Он просто пробует числа до тех пор, пока квадрат этого числа не станет больше, чем число «цели» (которое является входным умножением на 1Е в
number of decimals
квадрате (10.000 для 2 десятичного результата). Затем он печатает это последнее число.Запустите так (
-d
добавлено только по эстетическим соображениям):Не рекомендую пробовать это с чем-то больше, чем 3 десятичных знака или число выше 10.
источник