Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> z dzięsiętnej na binarną alternatywnie, graficzna interp. ciągu Fibonacciego
onlyX
post
Post #1





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Grajewo

Ostrzeżenie: (0%)
-----


Staram się zrobić graficzną interpretację dwójkową ciagu Fibbonacciego, tak jak jest pokazane na tej stronie: http://pl.wikipedia.org/wiki/Ci%C4%85g_Fib...a_dw.C3.B3jkowa

Tylko natrafiłem na dosyc powazny problem. php ma kłopot z konwersją dużych liczb dziesiętnych na binarne. Efekt: http://www.understyle.linuxpl.com/php_test/fibonacci.php

Cały kod wygląda tak:
  1. <?php
  2. $fib = array();
  3.  
  4. for($i=0; $i<150; $i++) {
  5. if ($i==0) {
  6. $fib[]=0;
  7. }
  8. else if ($i==1) {
  9. $fib[]=1;
  10. }
  11. else {
  12. $fib[]=bcadd($fib[$i-1], $fib[$i-2]);
  13. }
  14. }
  15.  
  16. echo '<p style=\"width:150px; text-align:right; line-height:1px\">';
  17.  
  18. for($i=0; $i<count($fib); $i++) {
  19. $txt = base_convert($fib[$i],10,2);
  20. // $txt = decbin($fib[$i]);
  21. $txt = str_replace(&#092;"0\", '<img src=\"w.gif\" />', $txt);
  22. $txt = str_replace(&#092;"1\", '<img src=\"b.gif\" />', $txt);
  23. echo $txt .&#092;"<br />\";
  24. }
  25. echo &#092;"</p>\";
  26.  
  27. ?>


Czy istnieje jakaś inna metoda zamiany liczb dzięsiętnych na binarne?

Próbowałem zamiast:
Kod
base_convert(int,10,2)

użyć:
Kod
decbin(int)

ale ta funkcja okazała się jeszcze słabsza.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
hwao
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Napisz sobie sam funkcje ktora zkonwertuje dowolna liczbe dziesietna do dwujkowej w sumie to bedzie okolo 3 linijki + petla (while)
zwroci to jako string wiec problemu nie powino byc smile.gif
Go to the top of the page
+Quote Post
onlyX
post
Post #3





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Grajewo

Ostrzeżenie: (0%)
-----


Napisałem funkcję, ale brakuje w wyniku zawsze jednej cyfry i nie wiem jak odwrócić kolejność znaków w stringu.

  1. <?php
  2.  
  3. function dec2bin($dec) {
  4. $bin = &#092;"\";
  5. while($dec>=2){
  6. $dec = floor($dec/2);
  7. $bin = $bin . ($dec%2);
  8. }
  9. return $bin;
  10. }
  11.  
  12. ?>

Nie wiem jak sobie z tym poradzić.
Na koniec trzeba pewnie będzie jeszcze zamienić dzielenie Modulo na bcmod().
Go to the top of the page
+Quote Post
Radarek
post
Post #4





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. function dec2bin($dec) {
  4. $bin = &#092;"\";
  5. while($dec>0){
  6. $bin = ($dec % 2) . $bin;
  7. $dec = floor($dec/2);
  8. }
  9. return $bin;
  10. }
  11. ?>


Ten post edytował Radarek 2.06.2005, 11:05:56
Go to the top of the page
+Quote Post
onlyX
post
Post #5





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Grajewo

Ostrzeżenie: (0%)
-----


Dzięki Radarek. Funkcja działa poprawnie, ale tylko do pewnego momentu. Przy większych liczbach ma ju kłopoty. Zamieniłem wszystkie działania na ich odpowiedniki w BCMath, ale to niewiele dało:

  1. <?php
  2. function dec2bin($dec) {
  3. $bin = &#092;"\";
  4. while(bccomp($dec, 0)==1) {
  5. $bin = bcmod($dec, 2) . $bin;
  6. $dec = floor(bcdiv($dec, 2));
  7. }
  8. return $bin;
  9. }
  10. ?>


Ten post edytował onlyX 2.06.2005, 11:43:07
Go to the top of the page
+Quote Post
Radarek
post
Post #6





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


Hm.. chyba chodzi o funkcje floor -> ona nie obsluguje duzych liczb.

Sprobuj ustawic precyzje dzialan na 0 za pomoca funkcji
bscale (http://pl.php.net/manual/pl/function.bcscale.php) i normalnie dzielic na 2 bez zaokraglania.
Go to the top of the page
+Quote Post
onlyX
post
Post #7





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Grajewo

Ostrzeżenie: (0%)
-----


Radarek, jesteś wielki! biggrin.gif
Wszystko śmiga pięknie. Teraz mogę wygenerować ile chcem wyrazów ciągu.
Nie trzeba było nawet korzystac z funkcji bcscale, wystarczyło dodać treci parametr do bcdiv:
  1. <?php
  2. function dec2bin($dec) {
  3. $bin = &#092;"\";
  4. while(bccomp($dec, 0)==1) {
  5. $bin = bcmod($dec, 2) . $bin;
  6. $dec = bcdiv($dec, 2, 0);
  7. }
  8. return $bin;
  9. }
  10. ?>

Jedynym problemem jest teraz wydajnośc mojego FireFoxa. smile.gif
Ma problem z wyświetleniem tylu GIFów na raz.

Trzebaby było wszystko pokazać w jenym obrazku, ale na tym ję już wogóle nie znam.
Go to the top of the page
+Quote Post
kszychu
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

Ostrzeżenie: (0%)
-----


Cytat(onlyX @ 2005-06-02 12:54:44)
Trzebaby było wszystko pokazać w jenym obrazku, ale na tym ję już wogóle nie znam.

Spróbuj użyć do tego gd.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
onlyX
post
Post #9





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Grajewo

Ostrzeżenie: (0%)
-----


Wiem jakiej biblioteki trzeba użyć. Ale nie znam się na jej obsłudze.
Wymyśliłem, żeby zamiast GIFów uzyć tekstu z odpowiednim stylem:
  1. <?php
  2. // (...)
  3. echo '<pre style=\"text-align:right; font-weight:bold; line-height:1px; font-size:1px\">';
  4. for($i=0; $i<count($fib); $i++) {
  5. $txt = dec2bin($fib[$i]); //konwersja z dziesietnej na binarna
  6. $txt = str_replace(&#092;"0\", ' ', $txt); //w zastepstwie bialego GIFa
  7. $txt = str_replace(&#092;"1\", '8', $txt); // //w zastepstwie czarnego GIFa
  8. //$txt = str_replace(\"0\", '<img src=\"w.gif\" />', $txt);
  9. //$txt = str_replace(\"1\", '<img src=\"b.gif\" />', $txt);
  10. echo $txt .&#092;"<br />\";
  11. }
  12. echo &#092;"</pre>\";
  13.  
  14. ?>

Różnica jest prawie niezauważalna, a skrypt mocno zyskuje na wydajności.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Cytat
Ale nie znam się na jej obsłudze.
To jest dobra okazja zeby sie nauczyc, kiedys ci sie przyda smile.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 09:05