2013-03-04 8 views
6

Czy jest możliwe obliczenie pułapu (np. ceil(2.12) = 3) z tylko kilkoma operacjami arytmetycznymi: * - + / I.e. bez castingu i innych sztuczek programistycznych, używając tylko operatorów podziału/mul/sub/dodawania i porównywania?Funkcja sufowa z użyciem ograniczonego zestawu operatorów arytmetycznych

Wyjaśnienia:

  • Złożoność jest ważne, ale będę zadowolony, aby usłyszeć żadnych rozwiązań.
  • Moduł niedostępny.
  • Wartości są dodatnie.
  • Operacje nie zaokrąglają.
  • Przez sztuczek oprogramowania Chciałem Mod, manipulacje na poziomie nieco itd

Zasadniczo mam system, który umożliwia przypisanie do zmiennych zwrotów gdzie wyrażenie może zawierać tylko powyższą operację arytmetyczną 4, porównań i pętle. Na przykład.

var x = if (A * (1,434 + 0,4325))> 54,4534), a następnie 45,6 jeszcze wtedy 43,435

i chciałbym zrobić

var x = CEIL (...)

+2

jest to zaokrąglenie podział? –

+0

Czy możesz dokładniej określić, co masz na myśli przez sztuczki z oprogramowaniem? Lub na przykład, jaki jest typ danych, w którym jest przechowywany i lub jakie jest dane wejściowe i wyjściowe wyżej wymienionych operacji (+ - * /) – Techmonk

+0

Czy operator modułu jest dostępny? –

Odpowiedz

7

Jest to możliwe, ale nie spodziewaj się niesamowitej wydajności. Najprostszy algorytm (th(x)) wynosi:

frac = x; 
while(frac<0) frac+=1; 
while(frac>=1) frac-=1; 

if(frac>0) return x-frac+1; 
else return x; 

można zrobić lepiej poprzez poszukiwanie binarnym (th(log x)):

lower = 0; 
upper = 0; 
if(x>0){ 
    upper = 1; 
    while (x > upper) upper *= 2; 
}else if(x<0){ 
    lower = -1; 
    while (x > lower) lower *= 2; 
} 

while(upper-lower > 1){ 
    //mid is guaranteed to be integer, since the upper-lower is a power of two 
    mid = (upper+lower)/2; 
    if(x > mid) lower = mid; 
    else if(x < mid) upper = mid; 
    else return mid; 
} 

return upper; // lower for floor 
+0

Mam to, dziękuję –

+0

Czy pierwszy algo nie uzyskałby wartości zerowej dla ułamków <1 i czy rzeczywiście jest równy> 1 lub czy coś nie rozumiem? – orom

+0

@orom oops, masz rację. naprawiony. –

Powiązane problemy