eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPorównywanie ułamków zwykłychRe: Porównywanie ułamków zwykłych
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!not-for-mail
    From: Piotr Chamera <p...@p...onet.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: Porównywanie ułamków zwykłych
    Date: Thu, 23 Sep 2010 13:21:38 +0200
    Organization: http://onet.pl
    Lines: 68
    Message-ID: <i7fd85$ndh$1@news.onet.pl>
    References: <op.vjdmp0xe8x7o78@notebook>
    <7...@g...googlegroups.com>
    <op.vjdzjw0f8x7o78@notebook> <i7amcm$gvk$1@news.onet.pl>
    <i7f59i$vue$1@news.onet.pl>
    NNTP-Posting-Host: public45845.xdsl.centertel.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: news.onet.pl 1285240901 23985 79.163.179.21 (23 Sep 2010 11:21:41 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Thu, 23 Sep 2010 11:21:41 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.9) Gecko/20100915
    Lightning/1.0b2 Thunderbird/3.1.4
    In-Reply-To: <i7f59i$vue$1@news.onet.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:186964
    [ ukryj 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: