Twoim zadaniem jest obliczenie pierwiastka kwadratowego dodatniej liczby całkowitej bez użycia żadnych operatorów matematycznych do zmiany liczby, takich jak:
- Ustawianie zmiennej (np. SquareRoot = 5)
- Dodawanie (A + B)
- Odejmowanie (AB)
- Mnożenie (A * B)
- Division (A / B)
- Pierwiastki kwadratowe, sześcianowe, czwarte itd
- Wykładniki
Operatory porównania (takie jak <,>, == itp.) Nie są uważane za „operatory matematyczne” na potrzeby tego pytania i są dozwolone, o ile nie zmieniają wartości zmiennej.
Jedynym operatorem, którego możesz używać, jest ++. Obowiązują następujące wyjątki:
- Jeśli chcesz, możesz zainicjować zmienną, ustawiając ją na 0.
- Jeśli twój język nie zawiera składni ++, możesz użyć równoważnej składni, takiej jak foo + = 1 lub foo = foo + 1
- Pierwiastek kwadratowy należy obliczyć co najmniej 6 cyfr po przecinku (miejsce stu tysięcy) i wyprowadzić jako liczbę całkowitą po przecinku (np. Jeśli wprowadzę 2, może wynieść 14142135624 lub 1414213 w zależności od zaokrąglenia) . Zaokrąglanie w górę lub w dół nie jest ważne.
Funkcje zdefiniowane przez użytkownika są niedozwolone. Ponadto niedozwolone jest także symulowanie funkcji za pomocą goto.
Chcę zobaczyć, co wszyscy przesyłają! Miłego kodowania!
WYJAŚNIENIE
Wyjaśnij, że liczba jest dodatnią liczbą całkowitą. Możesz stworzyć kod, który będzie zawierał dowolną liczbę, ale nie jest to konieczne.
WYJAŚNIENIE # 2
Wyjaśnij, że operatory porównania są dozwolone.
WYJAŚNIENIE # 3
Dodawanie, odejmowanie, mnożenie, dzielenie, oraz funkcje do numerów zmian są niedozwolone w ogóle , niezależnie od tego, czy są one zapisywane do zmiennej lub nie. Przykro mi, że to unieważnia kilka istniejących odpowiedzi, ale chciałem zdefiniować tę grupę operatorów za pomocą „zmień numer”, aby zapobiec odpowiedziom troll (np. Właśnie użyłem funkcji sqrt (), zabroniłeś tylko dodawania, mnożenie, dzielenie i odejmowanie). Przepraszam za zamieszanie.
WYJAŚNIENIE # 4
Wyjaśnij, że potrzebujemy co najmniej 5 cyfr. 10 cyfr spowodowało, że kod działał przez długi czas.
źródło
while r*r<n*10e20:r+=1
- dość trywialny. Możesz także rozważyć zmniejszenie wymaganej wydajności do około 10 ^ 8. Po pierwsze, ponieważ 10 ^ 10 jest większe niż 2 ^ 31, a po drugie, ponieważ zwiększenie tej wartości zajmuje trochę czasu.Odpowiedzi:
Python 66
Wynik
źródło
int(...*1e10)
przeciwnym razie bardzo miłe. Chociaż przyjmowanieabs
złożonej wartości jest mniej więcejsqrt
w przebraniu.*1e10
...Python, 184 znaki
Poniższe rozwiązanie Python używa tylko operatora inkrementacji i żadnych innych operatorów arytmetycznych. Jednak przy wymaganej precyzji (10 cyfr) uruchomienie zajmuje niemożliwie długo. Możesz to przetestować z mniejszą precyzją (3 cyfry), zmniejszając
1e20
do1e6
.Nie golfowany:
źródło
Fortran 73
Może zająć dużo czasu, aby rzeczywiście znaleźć odpowiedź na określone wartości, ale na pewno zadziała. Podczas gdy używam
*
i-
, nie zmieniają one żadnych wartości , tylkos=s+1
faktycznie coś zmienia.źródło
*
operatora, co jest dość wyraźnie niedozwolone. A może w jakiś sposób nie rozumiem podanych ograniczeń?*
operatora do zmiany numeru, po prostu nigdzie nie zapisujesz wyniku. Jeśli PO chciał po prostu zabronić przydziałów (innych niżs=s+1
), to po co wspominać o wszystkich niedozwolonych operatorach arytmetycznych?CJam, 26 bajtów
Wypróbuj online. Wklej kod , wpisz żądaną liczbę całkowitą w polu Input i kliknij Uruchom . Zanim to zrobisz, sugeruję zmianę
1e10
na1e4
chociaż.W interpreter Java uchwyty
1e6
z wejściem „2” w około 15 sekund.1e20
będzie wymagał ogromnej ilości pamięci RAM.Przykłady
tło
Ponieważ nie zezwalamy operatorom matematycznym na zmianę liczb, użyjemy operatorów setwise do zmiany tablic.
Kod zaczyna się od „pomnożenia” danych wejściowych („i”) przez 1e20, ale bez faktycznego pomnożenia. Zamiast tego wypychamy tablicę zawierającą liczby całkowite „i”, tablicę zawierającą liczby całkowite 1e20, bierzemy ich kartezjański produkt i obliczamy jego długość.
Następnie naciskamy zero i inkrementujemy, aż iloczyn liczby całkowitej (obliczony jak powyżej) nie będzie już mniejszy niż
i * 1e20
. Powoduje to zaokrąglenie pierwiastka kwadratowego w górę.Jak to działa
źródło
Kobra - 62
Wysłany przed trzecią edycją, już nieważny.
Jest nie tylko krótki, ale powinien być wolny od przepełnienia
n < Decimal.maxValue
źródło
r/e*r/e
++
Scala, 117
Nie kończy się w rozsądnym czasie, nawet dla 2 jako danych wejściowych, ale działa. Możesz zauważyć, że robię
_+_
, ale to tylko dodaje 1, a Scala i tak nie ma++
operatora. Mógłbym zapisać dwa znaki, zastępując wewnętrzny Strumień Listą, ale wtedy zabrakłoby mu pamięci. Jak napisano, myślę, że skaluje się tylko w czasie przetwarzania, a nie zużycia pamięci.źródło
Haskell, 70 bajtów
f
podaje liczbę całkowitą pierwiastek kwadratowy przez znalezienie największej liczby, której kwadrat jest mniejszy lub równy wartości wejściowej. Funkcja kwadratus i
zwiększa się o jeden dla każdego elementu(i,i)
macierzy. (Wpisany na telefonie, więc może mieć literówki).źródło
PHP, 124 bajty
To wyczerpujący algorytm. Próbuje liczb, dopóki kwadrat tej liczby nie będzie większy niż liczba „bramkowa” (czyli razy 1E do
number of decimals
kwadratu (10.000 dla wyniku dziesiętnego). Następnie wypisze ostatnią liczbę.Działaj w ten sposób (
-d
dodany tylko ze względów estetycznych):Nie zaleca się wypróbowywania tego, używając czegoś więcej niż 3 miejsca po przecinku lub liczby powyżej 10.
źródło