ďťż

Ładny brzuch

Mam sobie ciag liczb fibonacciego elegancko wpisany w tabeli. Do programu wprowadzam liczbe np 9. Chce zeby program pokazal mi wszystkie mozliwosci sum liczb z ciagu fibonacciego dajacych te liczbe. Czyli dla 9 bedzie to 1+3+5 oraz 1+8. Jak zrobic cos takiego? Jest jakas metoda czy trzeba przepaczac wszystkie mozliwosci? Mam nadzieje ze jest jakis sposob bo szczerze mowiac z wykonaniem wszystkich mozliwosci tez mam problem gdyz nie znam ilosci skladnikow. Prosze o pomoc



Przykład który opisujesz to na pewno nie ciąg liczb Fibonacciego o ile pamiętam to każdą liczbę ciągu Fibonacciego tworzy suma dwuch poprzedzających liczb (wyłączając dwie pierwsze liczby) czyli 1+3+5 nie pasuje do wzoru. Dwie ostatnie liczby mają sumę 8 a 5+8=13 czyli było by ...3, 5, 8, 13... gdzie tu 9? a i jedynka też nie pasuje bo przed 3,5 powinno być 0, 1, 1, 2...

Może się mylę jeśli tak niech mnie ktoś poprawi.
Użytkownik andyq edytował ten post 10 marzec 2006, 21:01

1+3+5 jak najbardziej pasuje:
0 1 1 2 3 5 8 13 21 ...



1+3+5 jak najbardziej pasuje:
0 1 1 2 3 5 8 13 21 ...



Nie wiem czy o to chodziło ale napisałem coś takiego:
program ciag_fibonacciego_AndyQ; uses crt; const   m=20; var   T:array[1..20]of longint;   i:byte;   liczba,n,f,fa,fb:longint; begin     clrscr;     f:=0;     fa:=0;     fb:=1;     for i:=1 to m do begin                          f:=fa+fb;                          fa:=fb;                          fb:=f;                          T[i]:=f;                       end;     write('Podaj liczbe: ');     readln(liczba);     n:=liczba;     for i:=m downto 1 do begin                              if n>=T[i] then begin                                                 n:=n-T[i];                                                 write(T[i]);                                                 if n>0 then write('+');                                                 end;                           end;     write('=',liczba); readln end.

Narazie versja 1.0 podaje wynik tak jak chciałeś ale tylko jedno rozwiązanie np.
dla liczby 255
233+21+1=255
dla 190
144+34+8+3+1=190
program jest dla 20 pierwszych liczb z ciągu ale możesz go dowolnie zmienić zwiększając wielkość tablicy oraz wartość stałej M
Jego działanie polega na sprawdzaniu liczb ciągu od końca aż trafi na mniejszą od podanej wtedy od liczby podanej przez ciebie odejmuje znalezioną w ciągu i tak w kółko aż wynik wyjdzie 0.
Użytkownik andyq edytował ten post 11 marzec 2006, 12:48
Co do pozostalych kombinacji to mozna by zrobic tak: wprowadzamy dodatkowa zmienna np q:=0. Jesli q=0 to przy znalezieniu liczby mniejszej lub rownej z ciagu fibonacciego odejmuje i jedzie dalej jak mowiles. Pozniej zwiekszamy wartosc q++, a dla q=1 szuka rowniez liczby mniejszej lub rownej tyle ze nie odejmujemy jej tylko liczbe o jeden w lewo, itd. Nie probowalem jeszcze bo juz pozno ale jesli ktos ma jakies inne pomysly to chetnie zobacze:)

Myśle że ta wersja powinna cię prawie zadowolić po wisaniu twojej liczby 9 podaje następujące wyniki:
8+1=9
5+3+1=9

Daj znać czy to miałeś na myśli

program ciag_fibonacciego_AndyQ_v1_1; uses crt; const     m=20; var   T:array[1..m]of longint;   i,i2,i3,i4,a:longint;   liczba,n,f,fa,fb:longint; begin     clrscr;     f:=0;     fa:=0;     fb:=1;     for i:=1 to m do begin                          f:=fa+fb;                          fa:=fb;                          fb:=f;                          T[i]:=f;                       end;     write('Podaj liczbe: ');     readln(liczba);     i3:=m;     repeat     i3:=i3-1;     until T[i3]<liczba;     for i2:=i3 downto 1 do begin                            n:=liczba;                            a:=0;                            for i4:=i2 downto 1 do a:=a+T[i4];                            if (a>=liczba) then begin                               for i:=i2 downto 1 do begin                                                     if n>=T[i] then begin                                                                     n:=n-T[i];                                                                     write(T[i]);                                                                     if n>0 then write('+');                                                                     end;                                                     end;                                                writeln('=',liczba);                                                end;                            end; readln end.

Tak, dokladnie o to dziekuje

Nie ma sprawy ;)
Ale z pośpiechu zapomniałem o wstawieniu komentarzy w kodzie źródłowym gdybyś miał jakiś problem daj znać a opisze dokładnie wszystkie zmienne i pętle.

Znalazałem mały błąd źle zadeklarowałem zmienne zamiast tego:
 T:array[1..m]of longint;  i,i2,i3,i4,a:longint;  liczba,n,f,fa,fb:longint;

Powinno być:
 T:array[1..m]of longint;  i,i2,i3,i4:byte;  a,liczba,n,f,fa,fb:longint;

Zapewne nie będziesz robił większej tablicy niż 255 elementów (nie będziemy też operować na elementach ujemnych) dlatego wszystkie zmienne dotyczące elementów tablicy powinny być w zakresie 0..255 czyli BYTE to i tak za dużo ponieważ już 47 element ciągu Fibonacciego przekroczy zakres zmiennych typu LONGINT -2147483648..2147483647 więc po co deklarować tyle pamięci.
Za ten głupi błąd sam obniżyłbym sobie ocenę ;)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •