Определение
Число положительно, если оно больше нуля.
Число ( A
) является делителем другого числа ( B
), если A
можно разделить B
без остатка.
Например, 2
является делителем, 6
потому что 2
может делиться 6
без остатка.
Цель
Ваша задача - написать программу / функцию, которая принимает положительное число, а затем найти все ее делители.
ограничение
- Вы не можете использовать какие-либо встроенные функции, относящиеся к простому или факторизации .
- Сложность вашего алгоритма не должна превышать O (sqrt (n)) .
свобода
- Выходной список может содержать дубликаты.
- Список вывода не нужно сортировать.
счет
Это код-гольф . Самое короткое решение в байтах побеждает.
Testcases
input output
1 1
2 1,2
6 1,2,3,6
9 1,3,9
code-golf
arithmetic
restricted-source
number-theory
restricted-complexity
Дрянная Монахиня
источник
источник
O(sqrt(n))
.99 (1 3 9 11 33 99)
Ответы:
PostgreSQL, 176 байт
SqlFiddleDemo
Входные данные:
(SELECT ...v)
Как это работает:
(SELECT ...v)
- входgenerate_series(1, sqrt(v)::int)
- числа от 1 до sqrt (n)WHERE v%r=0
-фильтр делителиSELECT r FROM c UNION SELECT v/r FROM c
генерируем остальные делители и объединяемSELECT string_agg(r::text,',' ORDER BY r)
получить окончательный результат через запятуюВведите как таблицу:
SqlFiddleDemo
Выход:
источник
C # 6, 75 байт
Основано на C #-решении downrep_nation, но рекурсивно и в гольфе дальше, используя некоторые новые функции из C # 6.
Базовый алгоритм такой же, как и у downrep_nation. Цикл for превращается в рекурсию, таким образом, второй параметр. Запуск рекурсии выполняется параметром по умолчанию, поэтому функция вызывается только с одним обязательным начальным номером.
Поскольку большинство ответов здесь (пока) не соответствуют точному формату вывода из примеров, я оставляю его как есть, но в качестве недостатка функция включает в себя одну запятую в конце.
источник
R ,
3631 байтПопробуйте онлайн!
-5 байт благодаря Робину Райдеру
источник
n^.5
вместоsqrt(n)
.1
много раз.Matlab, 48 байт
источник
sqrt(n)
а затем положить каждый делительd
иn/d
в моем списке.b=~mod(n,a)
чтобы сохранить 1 байт?J, 26 байт
объяснение
источник
JavaScript (ES6) - 48 байт
Не очень эффективно, но работает! Пример ниже:
источник
MATL , 12 байт
Подход аналогичен подходу в ответе @ flawr .
Попробуйте онлайн!
объяснение
источник
05AB1E ,
1412 байтКод:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Python 2, 64 байта
Эта анонимная функция выводит список делителей. Делители вычисляются путем пробного деления целых чисел на диапазон
[1, ceil(sqrt(n))]
, который равенO(sqrt(n))
. Еслиn % x == 0
(эквивалентноn%x<1
), то обаx
иn/x
являются делителямиn
.Попробуйте онлайн
источник
Желе , 9 байт
Как и другие ответы, это O (√n), если мы сделаем (ложное) предположение, что целочисленное деление есть O (1) .
Как это работает
Попробуйте онлайн!
источник
Javascript, 47 байт
источник
Mathematica, 50 байтов
Подобно @ flawr в растворе .
Выполняет разделение следа для x от 1 до квадратного корня из n и, если оно делится, сохраняет его в списке как x и n / x .
∣
для представления в UTF-8 требуется 3 байта, а для строки из 48 символов требуется 50 байтов в представлении UTF-8.использование
источник
JavaScript (ES6),
6662 байтаЯ думал, что напишу версию, которая возвращает отсортированный дедуплицированный список, и на самом деле он оказался на 4 байта короче ...
источник
C #, 87 байт
Golfed
Ungolfed
Полный код
релизы
87 bytes
- Исходное решение.Заметки
var
's' иint
's' вместоString
's' иInt32
's', чтобы сделать код короче, а в коде Ungolfed и полном коде я используюString
'sInt32
' и 's', чтобы сделать код более читабельным.источник
for
как правило, лучше, чемwhile
.for
цикл будет иметь ту же длину, что иwhile
цикл. В этом случае не имеет значения иметь или иметь другого.Луа, 83 байта
Я не мог сделать лучше, к сожалению
источник
Perl 6 , 40 байт
Объяснение:
Использование:
источник
c #, 87 байт
я не знаю, работает ли это для всех номеров, я подозреваю, что это работает.
но сложность правильная, так что это уже что-то не так
источник
Рубин, 56 байт
источник
Машинный код IA-32, 27 байтов
HexDump:
Исходный код (синтаксис MS Visual Studio):
Первый параметр (
ecx
) - это указатель на вывод, второй параметр (edx
) - это число. Это никак не помечает конец вывода; нужно предварительно заполнить выходной массив нулями, чтобы найти конец списка.Полная программа C ++, которая использует этот код:
Вывод имеет некоторые глюки, даже если он соответствует спецификации (нет необходимости в сортировке; нет необходимости в уникальности).
Вход: 69
Выход:
Делители попарно.
Вход: 100
Выход:
Для идеальных квадратов последний делитель выводится дважды (это пара с самим собой).
Вход: 30
Выход:
Если вход близок к идеальному квадрату, последняя пара выводится дважды. Это из-за порядка проверок в цикле: сначала он проверяет «remainder = 0» и выводит, и только потом он проверяет «фактор <делитель» для выхода из цикла.
источник
SmileBASIC, 49 байтов
Использует тот факт, что
D>N/D
=D>sqrt(N)
для положительных чиселисточник
С,
8781 байтУлучшено @ceilingcat , 81 байт:
Попробуйте онлайн!
Мой оригинальный ответ, 87 байт:
Скомпилируйте
gcc div.c -o div -lm
и запустите./div <n>
.Бонус: еще более короткий вариант с O (n) сложностью и жестким кодом
n
(46 байт + длинаn
):Редактировать: Спасибо @Sriotchilism O'Zaic за указание, что входные данные не должны быть жестко закодированы, я изменил основную отправку, чтобы принимать ввод через argv.
источник
n
вход? Помещение ввода в переменную не является приемлемым способом ввода здесь по ряду причин. Вы можете узнать больше о наших принятых и неприемлемых формах ввода и вывода здесь: codegolf.meta.stackexchange.com/questions/2447/… . А если вам интересен конкретный язык (например, C), вы можете посмотреть здесь: codegolf.meta.stackexchange.com/questions/11924/… .n
это вход. Я постараюсь изменить его так, чтобы он принимал ввод другим способом. Благодарю вас за информацию!APL (NARS), 22 символа, 44 байта
тест:
источник
C # (интерактивный компилятор Visual C #) , 40 байт
Просто предоставил обновленный ответ C #
Попробуйте онлайн!
источник