Implemente uma função divide(int a, int b, int c)
que imprima o valor base 10 de a/b
. sem usar nenhuma matemática de ponto flutuante nem BigInteger
/ BigDecimal
ou bibliotecas equivalentes. Pelo menos c
caracteres precisos dentro do conjunto de 0123456789.
devem ser impressos, exceto a (possível) exceção no ponto 4 abaixo.
a
eb
pode ser qualquer número inteiro de 32 bits. Atualização: se, para fins de golfe, você gostaria que as entradas fossem primitivas de 64 bits, tudo bem, mas você não precisa oferecer suporte a todo o intervalo de dados de 64 bits.- Você não precisa verificar se
c
é positivo (embora, esperançosamente, seu programa não trava), se não for. - O limite superior mínimo suportado para
c
é500
. Tudo bem se o seu programa não oferecer suporte aos valoresc
acima500
, mas também estará bem se houver. - Para números que se dividem igualmente, é sua escolha imprimir zeros extras (com base no valor de
c
) ou nada. - Você não precisa usar a função para executar outras tarefas com o quociente, o único objetivo é imprimir.
- Para números entre
-1
e1
, é sua escolha imprimir um líder0
. No entanto, esse é o único cenário em que a impressão de um zero à esquerda é aceitável e você pode imprimir apenas um desses zero. - Você pode usar qualquer lógica de arredondamento / piso / teto que você preferir para a última casa decimal.
- Para uma resposta negativa, você deve imprimir um líder
-
. Isso não conta parac
. No entanto, é sua escolha se você deseja imprimir,
+
ou nada para uma resposta positiva. - Divisão inteira e módulo inteiro são permitidos. No entanto, lembre-se de que você está restrito a primitivos, a menos que opte por implementar sua própria
BigInteger
/BigDecimal
biblioteca, que conta com o tamanho do código. - Você não precisa lidar com o
b
ser0
, mas pode, se quiser. Seu programa pode inserir um loop infinito, ou travar, seb=0
, e você não será penalizado. - Ligeira alteração de regra por comentário. Para garantir que o campo de jogo esteja nivelado
a
e comb
garantia de números inteiros de 32 bits, você pode usar números inteiros de 64 bits. Se o idioma escolhido exceder os números inteiros de 64 bits como primitivo, você não poderá, em nenhum momento, usar essa funcionalidade (finja que ele está limitado a 64 bits). - Outro ponto que não está claro (embora não deva alterar nenhuma das respostas válidas atuais): embora
c
possa ser interpretado como o número de caracteres impressos ou o número de espaços após o decimal, seu programa deve usar dec
alguma forma de maneira relevante para decidir quantos caracteres imprimir. Em outras palavras,divide(2,3,2)
deve ter uma saída muito menor do quedivide(2,3,500)
; não é bom imprimir 500 caracteres sem levar em consideraçãoc
. - Na verdade, eu não ligo para o nome da função.
d
é bom para fins de golfe.
Entrada
Uma chamada de função e leitura stdin
são aceitas. Se você ler stdin
, qualquer caractere que não esteja no conjunto [-0123456789]
é considerado um delimitador de argumento.
Resultado
Caracteres stdout
conforme descrito acima.
Exemplo
para divide(2,3,5)
, todos os itens a seguir são saídas aceitáveis:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Outro exemplo: para divide(371,3,5)
o seguinte, são todas as saídas aceitáveis:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
E para divide(371,-3,5)
o seguinte são todos aceitáveis:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
a resposta seria, por exemplo, #30.67
Respostas:
Java, 92/128
Eu tive que improvisar para que
a
oub
pudesse ser -2147483648, pois números inteiros positivos de 32 bits contam apenas para 2147483647, por issoa
se tornou along
. Poderia haver uma maneira melhor de lidar com resultados negativos, mas eu sei que nenhum (double
provavelmente faria isso funcionarabs(a) < abs(b)
como eles têm,-0
mas apenas o complemento de um manteria a precisão).Por que números de dois bytes? Eu precisava de 92 bytes para o cálculo e 36 para o auxiliar de impressão (
System.out.print
é uma porcaria; geralmente Java não é tão bom assim).O método basicamente exercita o que a maioria de nós aprendeu na escola para gerar os dígitos decimais solicitados.
fonte
Integer.MIN_VALUE
não é bom, mas quelong
como entrada é bom.System.out
faz Java parecer volumoso ;-) Ainda é uma sensação boa, já que há respostas mais longas postadas.C,
989589imprime
c
dígitos após o.
saída de exemplo:
deve funcionar para -2147483647 <= a <= 2147483647, o mesmo para b. lidar com isso
-
era uma dor.versão online: ideone
fonte
a=-a
.printf("-")
retorna 1.PHP, 108
Funciona simplesmente emitindo o quociente de
a
/b
durante um loop dec
etapas,a
tornando-se o restante multiplicado por 10 a cada iteração.DEMO
fonte
function d($a,$b,$c){if($a*$b<0)$a*=-print'-';for($p='.';$c--;$a*=10,$p=''){$a-=$b*$i=($a-$a%$b)/$b;echo$i.$p;}}
consulte o valor de retornoPython 111
Esta solução não viola nenhuma das regras declaradas.
fonte
C: 72 caracteres
Faz quase inteiramente o que é suposto fazer. No entanto, como algumas das outras respostas aqui fornecerão valores instáveis ou falharão,
d(-2147483648,b,c)
ed(a,-2147483648,c)
como o valor absoluto de -2147483648 está fora dos limites para uma palavra de 32 bits.fonte
Perl, sem aritmética, 274 bytes
Essa é a divisão longa euclidiana , que provavelmente consumirá uma quantidade incomum de memória. O mais próximo possível da matemática dos números de ponto flutuante é usar operações de bits para analisá-los.
Exemplos:
Resultado:
fonte
Ruby, 178
Versão online para teste.
O truque é multiplicar um com um número bastante alto, para que o resultado seja apenas um múltiplo inteiro da operação de ponto flutuante. Em seguida, o ponto e os zeros devem ser inseridos no lugar certo na sequência resultante.
fonte
g
ir além de 64 bits para grandec
? Edit: Eu acho que você está usando implicitamenteBigInteger
aquig
é uma cadeia, mas antes de chamarto_s
você criou um número na memória que está além de 64 bits em tamanhopython 92 bytes:
eu acho que um pouco mais de golfe é possível ...
fonte
e
ir além de 64 bits para grandes c? Edit: Eu acho que você está usando implicitamenteBigInteger
aqui.a=5
ec=400
depoise=10**c
, em hexadecimal, o número terá 333 dígitos. Começa que8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
isso é mais do que 64 bits.C 83
Mesma ideia que usei na minha implementação python
fonte
d(-2147483648,-1,10)