Definição
Um número é positivo se for maior que zero.
Um número ( A
) é o divisor de outro número ( B
) se A
puder dividir B
sem resto.
Por exemplo, 2
é um divisor de 6
porque 2
pode dividir 6
sem resto.
Objetivo
Sua tarefa é escrever um programa / função que receba um número positivo e depois encontrar todos os seus divisores.
Restrição
- Você não pode usar nenhum built-in relacionado a prime ou fatoração .
- A complexidade do seu algoritmo não deve exceder O (sqrt (n)) .
Liberdade
- A lista de saída pode conter duplicatas.
- A lista de saída não precisa ser classificada.
Pontuação
Isso é código-golfe . A solução mais curta em bytes vence.
Casos de teste
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
Freira Furada
fonte
fonte
O(sqrt(n))
.99 (1 3 9 11 33 99)
Respostas:
PostgreSQL, 176 bytes
SqlFiddleDemo
Entrada:
(SELECT ...v)
Como funciona:
(SELECT ...v)
- entradagenerate_series(1, sqrt(v)::int)
- números de 1 a sqrt (n)WHERE v%r=0
divisoresSELECT r FROM c UNION SELECT v/r FROM c
gerar resto de divisores e combinarSELECT string_agg(r::text,',' ORDER BY r)
produzir resultado separado por vírgula finalEntrada como tabela:
SqlFiddleDemo
Resultado:
fonte
C # 6, 75 bytes
Baseado na solução C # de downrep_nation, mas recursivo e mais avançado, utilizando alguns novos recursos do C # 6.
O algoritmo básico é o mesmo que o apresentado por downrep_nation. O loop for é girado para uma recursão, portanto, o segundo parâmetro. O início da recursão é feito pelo parâmetro padrão, portanto, a função é chamada apenas com o número inicial necessário.
Como a maioria das respostas aqui (ainda) não segue o formato de saída exato dos exemplos, eu o mantenho como está, mas, como desvantagem, a função inclui uma única vírgula no resultado.
fonte
R ,
3631 bytesExperimente online!
-5 bytes graças a Robin Ryder
fonte
n^.5
vez desqrt(n)
.1
várias vezes.Matlab, 48 bytes
fonte
sqrt(n)
e depois coloco cada divisord
en/d
na minha lista.b=~mod(n,a)
para salvar 1 byte?J, 26 bytes
Explicação
fonte
JavaScript (ES6) - 48 bytes
Não é muito eficiente, mas funciona! Exemplo abaixo:
fonte
MATL , 12 bytes
A abordagem é semelhante à da resposta do @ flawr .
Experimente online!
Explicação
fonte
05AB1E ,
1412 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
Python 2, 64 bytes
Essa função anônima gera uma lista de divisores. Os divisores são calculados pela divisão experimental de números inteiros no intervalo
[1, ceil(sqrt(n))]
, que éO(sqrt(n))
. Sen % x == 0
(equivalente an%x<1
), então ambosx
en/x
são divisores den
.Experimente online
fonte
Geléia , 9 bytes
Como as outras respostas, este é O (√n) se fizermos a suposição (falsa) de que a divisão inteira é O (1) .
Como funciona
Experimente online!
fonte
Javascript, 47 bytes
fonte
Mathematica, 50 bytes
Semelhante à solução da @ flawr .
Executa a divisão da trilha para x de 1 até a raiz quadrada de n e, se divisível, salva em uma lista como x e n / x .
∣
requer 3 bytes para representar em UTF-8, fazendo com que a cadeia de 48 caracteres exija 50 bytes na representação UTF-8.Uso
fonte
JavaScript (ES6),
6662 bytesPensei em escrever uma versão que retornasse uma lista desduplicada classificada e que na verdade era 4 bytes mais curta ...
fonte
C #, 87 bytes
Golfe
Ungolfed
Código completo
Lançamentos
87 bytes
- Solução inicial.Notas
var
's' eint
'sString
' eInt32
's para diminuir o código, enquanto no Código Ungolfed e Código Completo eu usoString
' sInt32
' e ' s para tornar o código mais legível.fonte
for
geralmente é melhor quewhile
.for
loop teria o mesmo comprimento que owhile
loop. Nesse caso, é irrelevante ter ou ter o outro.Lua, 83 bytes
Infelizmente não consegui fazer melhor
fonte
Perl 6 , 40 bytes
Explicação:
Uso:
fonte
c #, 87 bytes
Eu não sei se isso funciona para todos os números, eu suspeito que sim.
mas a complexidade é certa, então isso já é algo que não é
fonte
Ruby, 56 bytes
fonte
Código de máquina IA-32, 27 bytes
Hexdump:
Código fonte (sintaxe do MS Visual Studio):
O primeiro parâmetro (
ecx
) é um ponteiro para a saída, o segundo parâmetro (edx
) é o número. Não marca o final da saída de forma alguma; deve-se preencher previamente a matriz de saída com zeros para encontrar o final da lista.Um programa C ++ completo que usa esse código:
A saída tem algumas falhas, apesar de seguir as especificações (sem necessidade de classificação; sem necessidade de exclusividade).
Entrada: 69
Resultado:
Os divisores estão em pares.
Entrada: 100
Resultado:
Para quadrados perfeitos, o último divisor é emitido duas vezes (é um par com ele mesmo).
Entrada: 30
Resultado:
Se a entrada estiver próxima de um quadrado perfeito, o último par será emitido duas vezes. É por causa da ordem das verificações no loop: primeiro, ele verifica "restante = 0" e as saídas e, somente então, verifica "quociente <divisor" para sair do loop.
fonte
SmileBASIC, 49 bytes
Usa o fato de que
D>N/D
=D>sqrt(N)
para números positivosfonte
C,
8781 bytesMelhorado por @ceilingcat , 81 bytes:
Experimente online!
Minha resposta original, 87 bytes:
Compile
gcc div.c -o div -lm
e corra com./div <n>
.Bônus: Uma variante ainda mais curta, com complexidade de tempo O (n) e codificada
n
(46 bytes + comprimento den
):Edit: Obrigado a @Sriotchilism O'Zaic por apontar que as entradas não devem ser codificadas, modifiquei a submissão principal para receber a entrada via argv.
fonte
n
a entrada? Colocar a entrada em uma variável não é uma maneira aceita de inserir aqui por vários motivos. Você pode ver mais sobre nossos formulários de entrada e saída aceitos e não aceitos aqui: codegolf.meta.stackexchange.com/questions/2447/… . E se você está curioso sobre um idioma específico (por exemplo, C), pode procurar aqui: codegolf.meta.stackexchange.com/questions/11924/… .n
é a entrada. Vou tentar modificá-lo para levar a entrada de outra maneira. Obrigado pela informação!APL (NARS), 22 caracteres, 44 bytes
teste:
fonte
C # (compilador interativo do Visual C #) , 40 bytes
Fornecendo apenas uma resposta C # atualizada
Experimente online!
fonte