Реализуйте функцию, divide(int a, int b, int c)
которая печатает базовое значение 10 a/b
. без использования математических и BigInteger
/ BigDecimal
или эквивалентных библиотек с плавающей запятой вообще. Должны быть напечатаны как минимум c
точные символы в наборе 0123456789.
, за исключением (возможного) исключения в пункте 4 ниже.
a
иb
может быть любыми 32-битными целыми числами. Обновление: если для целей игры в гольф вы хотите, чтобы входные данные были 64-битными примитивами, это нормально, но вам не нужно поддерживать весь 64-битный диапазон данных.- Вам не нужно проверять, что
c
является положительным (хотя, надеюсь, ваша программа не падает), если это не так. - Минимальная поддерживаемая верхняя граница для
c
IS500
. Это нормально, если ваша программа не поддерживает значенияc
выше500
, но это также нормально, если это так. - Для чисел, которые делятся поровну, вы можете выбрать, печатать ли дополнительные нули (в зависимости от значения
c
) или ничего. - Вам не нужно иметь возможность использовать эту функцию для выполнения каких-либо дальнейших задач с частным, единственная цель - печать.
- Для чисел между
-1
и1
, это ваш выбор, печатать ли ведущий0
. Однако это единственный сценарий, в котором допустима печать начального нуля, и вы можете напечатать только один такой ноль. - Вы можете использовать любую логику округления / пола / потолка, которую вы предпочитаете для последнего десятичного знака.
- Для отрицательного ответа вы должны напечатать ведущий
-
. Это не считается в сторонуc
. Тем не менее, это ваш выбор , если вы хотите, чтобы напечатать,
+
или ничего для положительного ответа. - Целочисленное деление и целочисленный модуль разрешены. Однако имейте в виду, что вы ограничены примитивами, если только вы не решите реализовать свою собственную
BigInteger
/BigDecimal
библиотеку, которая учитывает длину вашего кода. - Вам не нужно обращаться с
b
существом0
, хотя вы можете, если хотите. Ваша программа может войти в бесконечный цикл или аварийноb=0
завершить работу , если вы не будете оштрафованы. - Небольшое изменение правила за комментарий. Для того, чтобы убедиться , что игровое поле является уровень, в то время как
a
иb
гарантированно 32 - битные целые числа, вы можете использовать 64 битные длинные целые числа. Если выбранный вами язык выходит за пределы 64-битных целых чисел в качестве примитива, вы ни в коем случае не можете использовать эту функциональность (притворяться, что он ограничен 64-битными). - Еще один момент, который неясен (однако он не должен изменять ни один из текущих действительных ответов): хотя
c
его можно интерпретировать как число напечатанных символов или количество пробелов после десятичной дроби, ваша программа должнаc
каким-то образом использовать соответствующим образом решить, сколько символов печатать. Другими словами,divide(2,3,2)
должен быть намного короче, чемdivide(2,3,500)
; не нормально печатать 500 символов без учетаc
. - На самом деле меня не волнует название функции.
d
это нормально для целей игры в гольф.
вход
И вызов функции и чтение из stdin
принимаются. Если вы читаете из stdin
, любой символ, не входящий в набор [-0123456789]
, считается разделителем аргументов.
Выход
Персонажи stdout
как описано выше.
пример
для divide(2,3,5)
, все следующие являются приемлемыми результатами:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Другой пример: для divide(371,3,5)
следующего все приемлемые результаты:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
И для divide(371,-3,5)
следующего все приемлемо:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
ответ, например,30.67
Ответы:
Ява, 92/128
Я должен был импровизировать так, чтобы
a
илиb
могло быть -2147483648, поскольку положительные 32-разрядные целые числа учитываются только в 2147483647, поэтому онa
сталlong
. Может быть лучший способ обработки отрицательных результатов, но я не знаю ни одного (double
s, вероятно, заставили бы это работать так,abs(a) < abs(b)
как они имеют,-0
но только одно дополнение сохранило бы точность).Почему двухбайтовые числа? Мне понадобилось 92 байта для вычисления и 36 для помощника по печати (
System.out.print
отстой; в общем, Java - это не игра в гольф).Метод в основном использует то, чему большинство из нас научилось в школе, чтобы получить запрошенные десятичные цифры.
источник
Integer.MIN_VALUE
нехорошо, но вlong
качестве вклада это нормально.System.out
заставляет Java чувствовать себя громоздким ;-) Все еще хорошее чувство, что уже есть более длинные ответы, отправленные.С
989589печатает
c
цифры после.
пример вывода:
должно работать для -2147483647 <= a <= 2147483647, то же самое для b. обработка
-
была болью.онлайн версия: ideone
источник
a=-a
.printf("-")
возвращает 1.PHP, 108
Он работает, просто выводя частное
a
/b
во время циклаc
шагов,a
получая остаток, умноженный на 10 на каждой итерации.DEMO
источник
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;}}
смотрите возвращаемое значениеPython 111
Это решение не нарушает ни одно из заявленных правил.
источник
C: 72 символа
Он почти полностью делает то, что должен делать. Тем не менее, как и некоторые другие ответы здесь, он даст неправильные значения или потерпит неудачу,
d(-2147483648,b,c)
иd(a,-2147483648,c)
поскольку абсолютное значение -2147483648 выходит за пределы для 32-разрядного слова.источник
Perl, без арифметики, 274 байта
Это евклидово длинное деление, которое может потреблять необычное количество памяти. Самое близкое к математике для чисел с плавающей запятой это использование битовых операций для их анализа.
Примеры:
Выход:
источник
Руби, 178
Онлайн версия для тестирования.
Хитрость заключается в том, чтобы умножить a на довольно большое число, поэтому в результате получается просто целое число, кратное операции с плавающей запятой. Затем точка и нули должны быть вставлены в нужном месте в результирующей строке.
источник
g
выйти за пределы 64 бит для большихc
? Изменить: я думаю, что вы неявно используетеBigInteger
здесьg
это строка, но перед вызовомto_s
вы создали в памяти номер, размер которого превышает 64 битаPython 92 байта:
Я думаю, что возможно еще немного игры в гольф .....
источник
e
выйти за пределы 64 бит для больших с? Изменить: я думаю, что вы неявно используетеBigInteger
здесь.a=5
иc=400
послеe=10**c
, в шестнадцатеричном формате номер будет длиной 333 цифры. Начинается8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
это более 64 бит.С 83
Та же идея, которую я использовал в своей реализации Python
источник
d(-2147483648,-1,10)