Implemente una función divide(int a, int b, int c)
que imprima el valor base 10 de a/b
. sin utilizar ningún cálculos de coma flotante ni BigInteger
/ BigDecimal
o bibliotecas equivalentes de ningún tipo. Se deben imprimir al menos c
caracteres precisos dentro del conjunto de 0123456789.
, excepto la (posible) excepción en el punto 4 a continuación.
a
yb
puede ser cualquier número entero de 32 bits. Actualización: si, para fines de golf, desea que la entrada sea primitiva de 64 bits, está bien, pero no necesita admitir todo el rango de datos de 64 bits.- No necesita verificar que
c
sea positivo (aunque es de esperar que su programa no se bloquee) si no lo es. - El límite superior mínimo admitido para
c
es500
. Está bien si su programa no admite valores dec
arriba500
, pero también está bien si lo hace. - Para números que se dividen en partes iguales, usted elige si desea imprimir ceros adicionales (según el valor de
c
) o nada. - No necesita poder utilizar la función para realizar otras tareas con el cociente, el único objetivo es imprimir.
- Para los números entre
-1
y1
, es su elección si imprime un encabezado0
. Sin embargo, este es el único escenario donde la impresión de un cero inicial es aceptable, y solo puede imprimir uno de esos cero. - Puede usar cualquier lógica de redondeo / piso / techo que prefiera para el último decimal.
- Para una respuesta negativa, debe imprimir un encabezado
-
. Esto no cuenta parac
. Sin embargo, es su elección si desea imprimir,
+
o nada por una respuesta positiva. - La división entera y el módulo entero están permitidos. Sin embargo, tenga en cuenta que está restringido a primitivas, a menos que elija implementar su propia
BigInteger
/BigDecimal
biblioteca que cuenta en función de la longitud de su código. - No necesita manejar el
b
ser0
, aunque puede hacerlo si lo desea. Su programa puede entrar en un bucle infinito o bloquearse sib=0
no será penalizado. - Ligero cambio de regla por comentario. Para asegurarse de que el campo de juego esté nivelado
a
yb
garantizado que sean enteros de 32 bits, puede usar enteros de 64 bits. Si su idioma elegido va más allá de los enteros de 64 bits como primitivo, en ningún momento puede usar esa funcionalidad (pretenda que tiene un límite de 64 bits). - Otro punto que no está claro (sin embargo, no debería cambiar ninguna de las respuestas válidas actuales): aunque
c
puede interpretarse como el número de caracteres impresos o el número de espacios después del decimal, su programa debe usar dec
alguna manera relevante para decidir cuántos caracteres imprimir. En otras palabras,divide(2,3,2)
debería ser un resultado mucho más corto quedivide(2,3,500)
; no está bien imprimir 500 caracteres sin tener en cuentac
. - En realidad no me importa el nombre de la función.
d
Está bien para fines de golf.
Entrada
stdin
Se aceptan tanto una llamada de función como la lectura de . Si lees stdin
, cualquier carácter que no esté en el conjunto [-0123456789]
se considera un delimitador de argumento.
Salida
Caracteres a los stdout
descritos anteriormente.
Ejemplo
para divide(2,3,5)
, todos los siguientes son resultados aceptables:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Otro ejemplo: para divide(371,3,5)
lo siguiente son todos los resultados aceptables:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
Y para divide(371,-3,5)
lo siguiente son todos aceptables:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
la respuesta sería, por ejemplo,30.67
Respuestas:
Java, 92/128
Tuve que improvisar para que
a
ob
pudiera ser -2147483648 ya que los enteros positivos de 32 bits solo cuentan para 2147483647, por eso sea
convirtió en along
. Podría haber una mejor manera de manejar los resultados negativos, pero sé que ninguno (double
s probablemente haría que esto funcioneabs(a) < abs(b)
como lo han hecho,-0
pero solo el complemento de uno mantendría la precisión).¿Por qué dos números de byte? Necesitaba 92 bytes para el cálculo y 36 para el asistente de impresión (
System.out.print
apesta; generalmente Java no es tan golfoso).El método básicamente ejercita lo que la mayoría de nosotros aprendimos en la escuela para generar los dígitos decimales solicitados.
fuente
Integer.MIN_VALUE
no está bien, pero quelong
como aporte está bienSystem.out
hace que Java se sienta voluminoso ;-) Todavía es una buena sensación, que ya hay respuestas más largas publicadas.C,
989589imprime
c
dígitos después del.
salida de ejemplo:
debería funcionar para -2147483647 <= a <= 2147483647, lo mismo para b. manejar el
-
fue un dolor.versión en línea: ideone
fuente
a=-a
.printf("-")
devuelve 1.PHP, 108
Funciona simplemente emitiendo el cociente de
a
/b
durante un ciclo dec
pasos,a
convirtiéndose el resto multiplicado por 10 en cada iteración.MANIFESTACIÓN
fuente
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;}}
vea el valor de retornoPython 111
Esta solución no viola ninguna de las reglas establecidas.
fuente
C: 72 caracteres
Hace casi por completo lo que se supone que debe hacer. Sin embargo, como algunas de las otras respuestas aquí, dará valores inestables o fallará,
d(-2147483648,b,c)
yd(a,-2147483648,c)
dado que el valor absoluto de -2147483648 está fuera de los límites para una palabra de 32 bits.fuente
Perl, sin aritmética, 274 bytes
Esta es una división larga euclidiana , que probablemente consuma una cantidad inusual de memoria. Lo más parecido a las matemáticas en números de punto flotante es usar operaciones de bits para analizarlas.
Ejemplos:
Salida:
fuente
Rubí, 178
Versión en línea para pruebas.
El truco consiste en multiplicar un con un número bastante alto, por lo que el resultado es solo un múltiplo entero de la operación de coma flotante. Luego, el punto y los ceros deben insertarse en el lugar correcto de la cadena resultante.
fuente
g
ir más allá de 64 bits para grandesc
? Editar: Creo que está usando implícitamenteBigInteger
aquíg
es una cadena, pero antes de llamarto_s
ha creado un número en la memoria que supera el tamaño de 64 bitsPython 92 bytes:
Creo que un poco más de golf es posible .....
fuente
e
supera los 64 bits para c grande? Editar: creo que está usando implícitamenteBigInteger
aquí.a=5
yc=400
luegoe=10**c
, en hexadecimal, el número tiene 333 dígitos. Comienza8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
esto es más de 64 bits.C 83
La misma idea que usé en mi implementación de Python
fuente
d(-2147483648,-1,10)