Sua tarefa é calcular a raiz quadrada de um número inteiro positivo sem usar operadores matemáticos para alterar o número, como:
- Configurando uma variável (por exemplo, squareRoot = 5)
- Adição (A + B)
- Subtração (AB)
- Multiplicação (A * B)
- Divisão (A / B)
- Raízes quadradas, cubas, quarta, etc.
- Expoentes
Operadores de comparação (como <,>, ==, etc) não são considerados "operadores matemáticos" para os fins desta pergunta e são permitidos desde que não alterem o valor de uma variável.
O único operador que você pode usar é ++. As seguintes exceções estão em vigor:
- Se desejar, você pode inicializar uma variável configurando-a como 0.
- Se seu idioma não incluir a sintaxe ++, você poderá usar uma sintaxe equivalente, como foo + = 1 ou foo = foo + 1
- A raiz quadrada deve ser calculada com pelo menos 6 dígitos além do decimal (a casa das centenas de milhares) e gerar um número inteiro de casas decimais (por exemplo, se eu inserir 2, pode ser 14142135624 ou 1414213, dependendo do arredondamento) . Arredondar para cima ou para baixo não é importante.
Funções definidas pelo usuário não são permitidas. Além disso, a simulação de funções com goto também não é permitida.
Estou interessado em ver o que todos enviam! Feliz codificação!
ESCLARECIMENTO
Esclareça que o número é um número inteiro positivo. Você pode criar um código que faça qualquer número, mas isso não é necessário.
ESCLARECIMENTO # 2
Esclareça que operadores de comparação são permitidos.
ESCLARECIMENTO Nº 3
Adição, subtração, multiplicação, divisão e funções aos números de alteração não são permitidos em tudo , independentemente de se eles são salvos em uma variável ou não. Lamento que isso invalide algumas respostas existentes, mas pretendia definir esse grupo de operadores com "alterar o número" para evitar respostas de trolls (por exemplo, eu apenas usei a função sqrt (), você apenas proibiu a adição, multiplicação, divisão e subtração). Desculpe pela confusão.
ESCLARECIMENTO # 4
Esclareça que precisamos de pelo menos 5 dígitos. 10 dígitos fizeram com que o código fosse executado por um longo tempo.
fonte
while r*r<n*10e20:r+=1
- bastante trivial. Além disso, você pode considerar reduzir a saída necessária para 10 ^ 8 ou mais. Primeiro, porque 10 ^ 10 é maior que 2 ^ 31, e segundo, porque levará um tempo para incrementar esse valor alto.Respostas:
Python 66
Resultado
fonte
int(...*1e10)
, caso contrário, muito bom. Embora, assumirabs
um valor complexo esteja mais ou menossqrt
disfarçado.*1e10
...Python, 184 caracteres
A seguinte solução Python usa apenas o operador de incremento e nenhum outro operador aritmético. No entanto, com a precisão necessária (10 dígitos), leva um tempo incrivelmente longo para ser executado. Você pode testá-lo com menor precisão (3 dígitos), reduzindo
1e20
para1e6
.Ungolfed:
fonte
Fortran 73
Pode demorar um pouco para realmente determinar uma resposta para certos valores, mas funcionará com certeza. Enquanto eu uso
*
e-
, estes não estão alterando nenhum valor , apenas os=s+1
realmente muda alguma coisa.fonte
*
operador, o que claramente não é permitido. Ou estou de alguma forma entendendo mal as restrições dadas?*
operador para alterar um número, você não está salvando o resultado em nenhum lugar. Se o OP quisesse simplesmente não permitir atribuições (excetos=s+1
), por que mencionar todos os operadores aritméticos não permitidos?CJam, 26 bytes
Experimente online. Cole o código , digite o número inteiro desejado em Entrada e clique em Executar . Antes de fazer isso, sugiro mudar
1e10
para1e4
entanto.O interpretador Java lida
1e6
com a entrada "2" em cerca de 15 segundos.1e20
exigirá um enorme quantidade de RAM.Exemplos
fundo
Como não é permitido que operadores matemáticos alterem números, usaremos operadores setwise para alterar matrizes.
O código começa "multiplicando" a entrada ("i") por 1e20, mas sem nenhuma multiplicação real. Em vez disso, empurramos uma matriz contendo números inteiros “i”, uma matriz contendo números inteiros 1e20, pegamos seu produto cartesiano e calculamos seu comprimento.
Em seguida, pressionamos zero e incrementamos até que o produto inteiro inteiro (calculado como acima) não seja mais menor que
i * 1e20
. Isso faz com que a raiz quadrada seja arredondada para cima.Como funciona
fonte
Cobra - 62
Publicado antes da terceira edição, não é mais válido.
Não é apenas curto, mas deve ser livre de transbordamentos se
n < Decimal.maxValue
fonte
r/e*r/e
, o que é claramente um não-++
operador de matemática ...Scala, 117
Não termina em um período de tempo razoável, mesmo para 2 como entrada, mas funciona. Você pode perceber que estou fazendo
_+_
, mas isso apenas adiciona 1, e Scala não tem um++
operador de qualquer maneira. Eu poderia salvar dois caracteres substituindo o Stream interno por List, mas ele ficaria sem memória. Como está escrito, acho que é escalável apenas no tempo de processamento, não no uso de memória.fonte
Haskell, 70 bytes
f
fornece a raiz quadrada inteira encontrando o maior número cujo quadrado é menor ou igual à entrada. A função quadrática és i
incrementada em um para cada elemento de uma(i,i)
matriz. (Digitado no telefone, pode haver erros de digitação).fonte
PHP, 124 bytes
É um algoritmo exaustivo. Ele apenas tenta números até que o quadrado desse número seja maior que o número "objetivo" (que é o tempo de entrada 1E
number of decimals
ao quadrado (10.000 para um resultado decimal de 2). Em seguida, imprime esse último número.Execute assim (
-d
adicionado apenas por razões estéticas):Não recomende fazer isso com mais de três casas decimais ou um número acima de 10.
fonte