-
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
Następne wpisy z tego wątku
- 23.09.10 11:21 Piotr Chamera
- 23.09.10 11:21 Wojciech \"Spook\" Sura
- 23.09.10 19:30 Remek
- 23.09.10 19:32 Remek
- 23.09.10 22:49 Marcin Biegan
- 24.09.10 00:09 bartekltg
- 24.09.10 02:15 Mariusz Marszałkowski
Najnowsze wątki z tej grupy
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
Najnowsze wątki
- 2024-12-20 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-12-20 Rzeszów => International Freight Forwarder <=
- 2024-12-20 Katowice => Key Account Manager (ERP) <=
- 2024-12-20 Ekstradycja
- 2024-12-20 Mikroskop 3D
- 2024-12-20 Warszawa => Spedytor Międzynarodowy <=
- 2024-12-20 Warszawa => Analityk w dziale Trade Development (doświadczenie z Powe
- 2024-12-20 Warszawa => Full Stack .Net Engineer <=
- 2024-12-20 Warszawa => Programista Full Stack .Net <=
- 2024-12-19 Kamerka sam. na tył
- 2024-12-20 Jak być bezpiecznym z Li-Ion?
- 2024-12-19 Fujitsu LIFEBOOK E746
- 2024-12-19 Katowice => Administrator IT - Systemy Operacyjne i Wirtualizacja <=
- 2024-12-19 Warszawa => Junior Account Manager <=
- 2024-12-19 Katowice => Administrator IT - Operating Systems and Virtualization <=