2010-10-02 11 views
10

mogę dopełniają elementy A do najbliższych liczb całkowitych większych lub równych Asufitowa na piechotę 50

ceil(A) 

Ale co, jeśli chcę zaokrąglić go do najbliższego 50 większa lub równa A ?

Na przykład, biorąc pod uwagę następujące A tablicą

A=[24, 35, 78, 101, 199]; 

Podprogram należy zwrócić następujące

B=Subroutine(A)=[50, 50, 100, 150, 200]; 

Odpowiedz

15

Można to podzielić przez 50, podjęcia ceil() i mnożąc przez 50 ponownie :

octave:1> A=[24, 35, 78, 101, 199]; 
    octave:2> ceil(A) 
    ans = 

    24 35 78 101 199 

    octave:3> 50*(ceil(A/50.)) 
    ans = 

    50 50 100 150 200 
+1

Należy pamiętać, że może to niewykluczone wprowadzać zmiennoprzecinkowych zaokrąglania błędów, dla dużych wartości w A. –

+0

Meh, więc pozbyć się przecinka po 50 w dywizji. Albo liczby są wartościami zmiennoprzecinkowymi, w którym to przypadku problem już pojawił się gdzie indziej w kodzie, albo liczby są liczbami całkowitymi, w takim przypadku po prostu pozbyć się przecinka dziesiętnego, a teraz robisz podział i dodanie liczb całkowitych , w którym to przypadku nie występują problemy zmiennoprzecinkowe. Więc nie widzę problemu tutaj. –

+0

Problem polega na tym, że wyniki będą niepoprawne. :-) Na przykład wypróbuj '77777777777777777' jako dane wejściowe: ta metoda daje niepoprawny wynik' 77777777777777792', podczas gdy metoda modulus poprawnie podaje '77777777777777800'. –

8

Łatwym sposobem jest dodanie do każdego z elementów dopełnienia modulo 50:

octave> A = [24, 35, 78, 101, 199] 

octave> mod(-A, 50)  # Complement (mod 50) 
ans = 

    26 15 22 49 1 

octave> A + mod(-A, 50) # Sum to "next higher" zero (mod 50) 
ans = 

    50 50 100 150 200 

octave> A - mod(A, 50) # Can also sum to "next lower" zero (mod 50) 
ans = 

    0  0 50 100 150 

(Zauważ, że to zależy tylko od całkowitej arytmetyki, co pozwala uniknąć błędów wynikających z zmiennoprzecinkowych zaokrąglenia).

+2

Podoba mi się to, ponieważ wykorzystuje dodawanie/odejmowanie modulo, tj. Bez mnożenia/dzielenia. Jeśli jednak masz złożone wyrażenie zamiast A, możesz powrócić do rozwiązania, które używa funkcji ceil, ponieważ wyrażenie będzie wywoływane tylko raz w tym podejściu. Wszystko w kierunku prostoty kodu. – user36800

Powiązane problemy