eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPorównywanie ułamków zwykłychRe: Porównywanie ułamków zwykłych
  • Data: 2010-09-23 11:21:38
    Temat: Re: Porównywanie ułamków zwykłych
    Od: Piotr Chamera <p...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    I jeszcze wersja iteracyjna algorytmu (z komentarzami)
    i statystyka liczby iteracji.

    PS. Nie irytujcie się, jeśli to nikomu nie potrzebne.
    Tak mnie dzisiaj naszło na pisanie nawiasów :)

    (defun cmp-rational2 (a b c d)
    "Porównanie liczb a/b i c/d przy założeniu, że
    a, b, c, d dodatnie oraz b i d różne od 0.
    Liczby w obliczeniach pośrednich nigdy nie
    są większe od wejściowych. Wersja iteracyjna.

    Zwracane wartości:
    a/b > c/d => T
    a/b < c/d => NIL
    a/b = c/d => EQUAL"

    (do ((sign T) ; albo NIL - oznacza negację wyniku
    c1 r1 c2 r2) ; miejsce na wyniki dzielenia i reszty
    (NIL) ; pętla bez końca
    ;(print (list a b c d) nil) ; drukowanie parametrów pośrednich iteracji
    (multiple-value-setq (c1 r1) (truncate a b)) ; dzielenie całkowite
    z resztą
    (multiple-value-setq (c2 r2) (truncate c d)) ; dzielenie całkowite
    z resztą
    (cond
    ; jeśli części całkowite się różnią, to można wyznaczyć znak
    nierówności
    ((> c1 c2) (if sign
    (return T)
    (return NIL))
    ; zamiast (if...) można dać (return sign)
    )
    ((< c1 c2) (if sign
    (return NIL)
    (return T))
    ; zamiast (if...) można dać (return (not sign))
    )
    ; tu już wiemy, że w tej iteracji części całkowite były równe
    ; jeśli również reszty są zerowe to badane liczby są równe
    ((and (zerop r1) (zerop r2)) (return 'EQUAL))
    ; zmiana parametrów dla następnej iteracji
    ; a=b, b=reszta(a/b), c=d, d=reszta(c/d) i zmiana znaku
    (T (progn (setq sign (not sign)
    a b
    b r1
    c d
    d r2))))))



    Liczba iteracji (po lewej) i liczba wywołań wymagających tylu iteracji
    (po prawej). Próba 100 000 000 losowo generowanych porównań.

    (0 67751730)
    (1 23792799)
    (2 6988131)
    (3 1159932)
    (4 246927)
    (5 48544)
    (6 9536)
    (7 1927)
    (8 396)
    (9 66)
    (10 10)
    (11 2)


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: