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.rmf.pl!agh.edu.pl!news.agh.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 11:05:51 +0200
    Organization: http://onet.pl
    Lines: 109
    Message-ID: <i7f59i$vue$1@news.onet.pl>
    References: <op.vjdmp0xe8x7o78@notebook>
    <7...@g...googlegroups.com>
    <op.vjdzjw0f8x7o78@notebook> <i7amcm$gvk$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 1285232754 32718 79.163.179.21 (23 Sep 2010 09:05:54 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Thu, 23 Sep 2010 09:05:54 +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: <i7amcm$gvk$1@news.onet.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:186963
    [ ukryj nagłówki ]

    W dniu 2010-09-21 18:27, Piotr Chamera pisze:
    > W dniu 2010-09-21 16:22, Wojciech "Spook" Sura pisze:
    >> Tak też je przechowuję. Faktycznie, sprawdzenie, czy są równe jest
    >> proste; co jednak wówczas, gdy chciałbym je porównać?
    >
    > może tak:
    > gdy a > b i c > d to porównanie sprowadza się do porównania odwrotności
    > ułamków b/a i d/c...

    Z ciekawości, czy nie napisałem głupot spróbowałem
    zaimplementować tę procedurę. Oto co mi wyszło (CommonLisp):

    (defun cmp-rational (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.

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

    (multiple-value-bind (c1 r1) (truncate a b)
    (multiple-value-bind (c2 r2) (truncate c d)
    (cond ((> c1 c2) T)
    ((< c1 c2) NIL)
    ; już wiadomo że cz. całkowite są równe, sprawdzamy reszty
    ((and (zerop r1) (zerop r2)) 'EQUAL)
    (T (let ((r (cmp-rational b r1 d r2)))
    (if (eq r 'EQUAL)
    'EQUAL
    (not r))))))))

    Działa to całkiem sprawnie, dla miliona losowych par liczb,
    gdzie licznik i mianownik są z zakresu liczb 32-bitowych
    max głębokość rekursji wyniosła 9. Często jest jednak w zakresie
    1-2. Powinno to być też proste do przepisania na iteracje.
    Oto kilka przykładów:

    ,,trudny" przypadek z postów wyżej
    CL-USER> (cmp-rational 11 2147483629 17 2147483647)

    0: (CMP-RATIONAL 11 2147483629 17 2147483647)
    1: (CMP-RATIONAL 2147483629 11 2147483647 17)
    1: CMP-RATIONAL returned T
    0: CMP-RATIONAL returned NIL
    NIL

    równość
    CL-USER> (cmp-rational 11 2048 11 2048)

    0: (CMP-RATIONAL 11 2048 11 2048)
    1: (CMP-RATIONAL 2048 11 2048 11)
    2: (CMP-RATIONAL 11 2 11 2)
    3: (CMP-RATIONAL 2 1 2 1)
    3: CMP-RATIONAL returned EQUAL
    2: CMP-RATIONAL returned EQUAL
    1: CMP-RATIONAL returned EQUAL
    0: CMP-RATIONAL returned EQUAL
    EQUAL

    CL-USER> (cmp-rational 1 16 1 16)

    0: (CMP-RATIONAL 1 16 1 16)
    1: (CMP-RATIONAL 16 1 16 1)
    1: CMP-RATIONAL returned EQUAL
    0: CMP-RATIONAL returned EQUAL
    EQUAL

    ,,duże" liczby
    CL-USER> (cmp-rational 1 42536847596214256328 1 1248534474348433455)

    0: (CMP-RATIONAL 1 42536847596214256328 1 1248534474348433455)
    1: (CMP-RATIONAL 42536847596214256328 1 1248534474348433455 1)
    1: CMP-RATIONAL returned T
    0: CMP-RATIONAL returned NIL
    NIL
    CL-USER> (cmp-rational 11 2000000000000000000000 11 2000000000000000000000)

    0: (CMP-RATIONAL 11 2000000000000000000000 11 2000000000000000000000)
    1: (CMP-RATIONAL 2000000000000000000000 11 2000000000000000000000 11)
    2: (CMP-RATIONAL 11 9 11 9)
    3: (CMP-RATIONAL 9 2 9 2)
    4: (CMP-RATIONAL 2 1 2 1)
    4: CMP-RATIONAL returned EQUAL
    3: CMP-RATIONAL returned EQUAL
    2: CMP-RATIONAL returned EQUAL
    1: CMP-RATIONAL returned EQUAL
    0: CMP-RATIONAL returned EQUAL
    EQUAL
    CL-USER> (cmp-rational 11 2000000000000000000000 11 2000000000000000000001)

    0: (CMP-RATIONAL 11 2000000000000000000000 11 2000000000000000000001)
    1: (CMP-RATIONAL 2000000000000000000000 11 2000000000000000000001 11)
    2: (CMP-RATIONAL 11 9 11 10)
    3: (CMP-RATIONAL 9 2 10 1)
    3: CMP-RATIONAL returned NIL
    2: CMP-RATIONAL returned T
    1: CMP-RATIONAL returned NIL
    0: CMP-RATIONAL returned T
    T
    CL-USER> (cmp-rational 11 2000000000000000000002 11 2000000000000000000001)

    0: (CMP-RATIONAL 11 2000000000000000000002 11 2000000000000000000001)
    1: (CMP-RATIONAL 2000000000000000000002 11 2000000000000000000001 11)
    1: CMP-RATIONAL returned T
    0: CMP-RATIONAL returned NIL
    NIL

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: