Zaimplementuj funkcję, divide(int a, int b, int c)
która wypisuje podstawową wartość 10 a/b
. bez korzystania z matematyki zmiennoprzecinkowej ani BigInteger
/ BigDecimal
lub równoważnych bibliotek. Należy wydrukować co najmniej c
dokładne znaki w zestawie 0123456789.
, z wyjątkiem (możliwego) wyjątku w punkcie 4 poniżej.
a
ib
mogą być dowolnymi 32-bitowymi liczbami całkowitymi. Aktualizacja: Jeśli do gry w golfa chciałbyś mieć 64-bitowe prymitywy, to jest w porządku, ale nie musisz obsługiwać całego 64-bitowego zakresu danych.- Nie musisz sprawdzać, czy
c
jest to pozytywne (choć mam nadzieję, że twój program nie ulega awarii), jeśli tak nie jest. - Minimalna obsługiwana górna granica dla
c
to500
. Jest w porządku, jeśli twój program nie obsługuje wartościc
powyżej500
, ale jest również w porządku, jeśli tak. - W przypadku liczb, które dzielą się równomiernie, wybierasz, czy chcesz wydrukować dodatkowe zera (na podstawie wartości
c
), czy nic. - Nie musisz być w stanie używać tej funkcji do wykonywania dalszych zadań z ilorazem, jedynym celem jest drukowanie.
- W przypadku liczb między
-1
i od1
Ciebie zależy, czy chcesz wydrukować wiodącą wartość0
. Jest to jednak jedyny scenariusz, w którym drukowanie wiodącego zera jest dopuszczalne i można wydrukować tylko jedno takie zero. - Możesz użyć dowolnej logiki zaokrąglania / podłogi / sufitu dla ostatniego miejsca po przecinku.
- W przypadku odpowiedzi negatywnej musisz wydrukować wiodącą
-
. To się nie liczyc
. Jednakże, jest to Twój wybór, jeśli chcesz wydrukować,
+
lub nic na pozytywną odpowiedź. - Dozwolone są zarówno dzielenie całkowite, jak i moduł całkowity. Pamiętaj jednak, że jesteś ograniczony do prymitywów, chyba że zdecydujesz się zaimplementować własną bibliotekę
BigInteger
/BigDecimal
bibliotekę, która liczy się do długości twojego kodu. - Nie musisz zajmować się
b
bytem0
, chociaż możesz, jeśli chcesz. Twój program może wejść w nieskończoną pętlę lub ulec awarii, jeślib=0
nie zostaniesz ukarany. - Niewielka zmiana reguły dla komentarza. Aby upewnić się, że pole gry jest poziom, natomiast
a
ib
są gwarancją 32-bitowe liczby całkowite, można użyć 64-bitowych długich liczb całkowitych. Jeśli wybrany język wykracza poza 64-bitowe liczby całkowite jako prymityw, nie możesz w żadnym momencie korzystać z tej funkcji (udawać, że jest ograniczony do 64 bitów). - Inna kwestia, która jest niejasna (nie powinna jednak zmieniać żadnej z aktualnych poprawnych odpowiedzi): chociaż
c
może być interpretowana albo jako liczba drukowanych znaków, albo liczba spacji po przecinku, twój program music
jakoś używać w odpowiedni sposób aby zdecydować, ile znaków do wydrukowania. Innymi słowy,divide(2,3,2)
wyjście powinno być znacznie krótsze niżdivide(2,3,500)
; wydrukowanie 500 znaków bez względu na to nie jest w porządkuc
. - Właściwie nie dbam o nazwę funkcji.
d
jest w porządku do gry w golfa.
Wejście
stdin
Akceptowane jest zarówno wywołanie funkcji, jak i odczyt . Jeśli czytasz z stdin
, dowolny znak spoza zestawu [-0123456789]
jest uważany za separator argumentu.
Wynik
Znaki stdout
jak opisano powyżej.
Przykład
ponieważ divide(2,3,5)
wszystkie z poniższych są dopuszczalnymi wynikami:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Kolejny przykład: dla divide(371,3,5)
następujących są wszystkie dopuszczalne wyniki:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
I dla divide(371,-3,5)
następujących są wszystkie dopuszczalne:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
zrobiłbyś, na przykład,30.67
Odpowiedzi:
Java, 92/128
Musiałem improwizować tak, że
a
albob
może być -2147483648 jako dodatnie 32-bitowe liczby całkowite liczyć tylko w kierunku 2147483647, dlategoa
stał sięlong
. Może istnieć lepszy sposób radzenia sobie z negatywnymi wynikami, ale nie znam żadnego (double
prawdopodobnie zapewnią to działanie,abs(a) < abs(b)
ponieważ mają,-0
ale tylko dopełnianie jednego z nich zachowa precyzję).Dlaczego dwie liczby bajtów? Potrzebowałem 92 bajtów do obliczeń i 36 dla pomocnika drukowania (do
System.out.print
bani; generalnie Java nie jest taka golfowa).Metoda w zasadzie ćwiczy to, czego większość z nas nauczyła się w szkole, aby wygenerować wymagane cyfry dziesiętne.
źródło
Integer.MIN_VALUE
nie jest w porządku, alelong
jako że dane wejściowe są w porządku.System.out
sprawia, że Java wydaje się nieporęczna ;-) Nadal dobre wrażenie, że już są dłuższe odpowiedzi.C,
989589drukuje
c
cyfry po.
przykładowe dane wyjściowe:
powinien działać dla -2147483647 <= a <= 2147483647, to samo dla b. radzenie sobie z tym
-
było uciążliwe.wersja online: ideone
źródło
a=-a
.printf("-")
zwraca 1.PHP, 108
Działa po prostu wyprowadzając iloraz
a
/b
podczas pętlic
kroków,a
stając się resztą pomnożoną przez 10 przy każdej iteracji.PRÓBNY
źródło
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;}}
patrz zwracana wartośćPython 111
To rozwiązanie nie narusza żadnej z podanych zasad.
źródło
C: 72 znaki
Prawie całkowicie robi to, co powinien. Jednak, ponieważ niektóre inne odpowiedzi tutaj przyniosą dziwne wartości lub zawiodą
d(-2147483648,b,c)
ad(a,-2147483648,c)
ponieważ wartość bezwzględna -2147483648 jest poza zakresem dla słowa 32-bitowego.źródło
Perl, brak arytmetyki, 274 bajty
Jest to długi podział euklidesowy , który prawdopodobnie pochłonie niezwykłą ilość pamięci. Najbliżej matematyki na liczbach zmiennoprzecinkowych jest użycie operacji bitowych do ich analizy.
Przykłady:
Wynik:
źródło
Ruby, 178
Wersja online do testowania.
Sztuczka polega na pomnożeniu a przez dość dużą liczbę, więc wynikiem jest tylko liczba całkowita operacji zmiennoprzecinkowej. Następnie punkt i zera należy wstawić we właściwym miejscu w wynikowym ciągu.
źródło
g
wyjść poza 64 bitów dla dużychc
? Edycja: Myślę, że domyślnie używaszBigInteger
tutajg
to ciąg znaków, ale zanim zadzwoniszto_s
, utworzyłeś w pamięci liczbę przekraczającą 64 bitypython 92 bajty:
myślę, że możliwe jest trochę golfa .....
źródło
e
więcej niż 64 bity dla dużego c? Edycja: Myślę, że domyślnie używaszBigInteger
tutaj.a=5
ic=400
to poe=10**c
, w hex, numer jest 333 cyfr. Zaczyna się,8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
że jest to więcej niż 64 bity.C 83
Ten sam pomysł, którego użyłem w mojej implementacji Python
źródło
d(-2147483648,-1,10)