Wątek przeniesiony 2017-10-09 12:20 z C/C++ przez kq.

Wyznaczanie sumy parzystych wyrazów ciągu Fibonacciego za pomocą tablic i pętli for

0

Treść zadania:

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

Mój kod źródłowy, działa ale wynik jest błędny:

#include <iostream>

using namespace std;

int main()
{
    long double fib[100000];

    fib[0]=1;
    fib[1]=2;
    int i=2;

    for (int i;i<999999;i++)
    {
        fib[i]=fib[i-1]+fib[i-2];
    }

    if (fib[i]<=4000000 && i%2==0)
    {
        long suma;
        suma += fib[i];
        cout<<suma;
    }
    
    return 0;
}

Jakieś wskazówki? Dopiero się uczę tablic, próbowałem robić różne przekształcenia, ale za każdym razem wynik jest błędny. Nie potrafię jeszcze odróżnić jak się dostać do konkretnego indeksu w tablicy, a jak do konkretnej danej (w tym przypadku chodzi o dane mniejsze/równe 4000000). Może ktoś potrafi wyjaśnić to prostym językiem?

2

Bardzo nam przykro, ale nie możemy Ci pomóc, Project Euler Honour Code nie pozwala:)

2

Małe wskazówki, zbyt wiele wyrazów ciągu Fibonacciego próbujesz obliczyć, w niewłaściwym miejscu sumujesz, źle zrozumiałeś zadanie - masz sumować parzyste wyrazy, a nie wyrazy o parzystych indeksach.
Mała ilustracja do pierwszej uwagi, chcesz obliczyć wyraz o indeksie 999999, już wyraz o indeksie 10000 ma wartość:

33644764876431783266621612005107543310302148
46068006390656476997468008144216666236815559551363373402558206533268083615937373
47904838652682630408924630564318873545443695598274916066020998841839338646527313
00088830269235673613135117579297437854413752130520504347701602264758318906527890
85515436615958298727968298751063120057542878345321551510387081829896979161312785
62650331954871402142875326981879620469360978799003509623022910263681314931952756
30227837628441540360584402572114334961180023091208287046088923962328835461505776
58327125254609359112820392528539343462090424524892940390170623388899108584106518
31733604374707379085526317643257339937128719375877468974799263058370657428301616
37408969178426378624212835258112820516370298089332099905707920064367426202389783
11147005407499845925036063356093388383192338678305613643535189213327973290813373
26426526339897639227234078829281779535805709936910491754708089318410561463223382
17465637321248226383092103297701648054726243842374862411453093812206564914032751
08664339451751216152654536133311131404243685480510676584349352383695965342807176
87753283482343455573667197313927462736291082106792807847180353291311767789246590
89938635459327894523777674406192240337638674004021330343297496902028328145933418
82681768389307200363479562311710310129195316979460763273758925353077255237594378
84345040677155557790564504430166401194625809722167297586150269684431469520346149
32291105970676243268515992834709891284706740862008587135016260312071903172086094
08129832158107728207635318662461127824553720853236530577595643007251774431505153
96009051686032203491632226408852488524331580515348496224348482993809050704834824
49327453732624567755879089187190803662058009594743150052402532709746995318770724
37682590741993963226598414749819360928522394503970716544315642132815768890805878
31834049174345562705202235648464951961124602683139709750693826487066132645076650
74611512677522748621598642530711298441182622661057163515069260029861704945425047
49137811515413994155067125627119713325276363193960690289565028826860836224108205
0562430701794976171121233066073310059947366875
2
int i;

Jaką wartość ma i?

0
bogdans napisał(a):

Małe wskazówki, zbyt wiele wyrazów ciągu Fibonacciego próbujesz obliczyć, w niewłaściwym miejscu sumujesz, źle zrozumiałeś zadanie - masz sumować parzyste wyrazy, a nie wyrazy o parzystych indeksach.

Zadanie rozumiem doskonale, bo już je kiedyś rozwiązałem (znam wynik i przejrzałem forum Eulera - nikt nie rozwiązywał tego w ten sposób), wcześniej jednak zrobiłem to innym sposobem. Teraz zależy mi na wykorzystaniu tablic i właśnie pętli for i nie wiem jak dotrzeć do zapisanych w tablicy wartości, zamiast do indeksów.

Zliczanie sumy umieściłem w pętli, zmniejszyłem obszar tablicy i ilość powtórzeń w pętli, ale przeszkodą chyba jest to, że ciągle odwołuję się do indeksów w tablicy a nie do zapisanych w komórkach wartości - po prostu nie wiem jak to zrobić. Na koniec pewnie trzeba będzie dodać jeszcze do sumy wartość 2 z indeksu 1 tablicy - to już też poprawiłem, ale w zasadzie nadal stoję w miejscu. Może ktoś podpowie jak wyciągać liczbę z tablicy :P?

0

Wierzę Ci bo to zadanie jest łatwe. Rozumiem, że elementy ciągu mają być w tablicy, to umieszczenie w pętli:
fib[i]=fib[i-1]+fib[i-2]
raczej nie pomoże:)
A gdyby tak zacząć od:

x = 2
y = 1

a potem w pętli przypisywać:

x <- x + y
y  <- x // tu musi być "stare" x

Widać, że będą to kolejne wyrazy ciągu, teraz tylko zamiast x - ów i y - ków odpowiednie elementy tablicy i już:)

0

Zliczanie sumy umieściłem w pętli, zmniejszyłem obszar tablicy i ilość powtórzeń w pętli, ale przeszkodą chyba jest to, że ciągle odwołuję się do indeksów w tablicy a nie do zapisanych w komórkach wartości - po prostu nie wiem jak to zrobić
Nieprawda, podczas sumowania i sprawdzania zakresu odwołujesz się do wartości zapisanych w tablicy.

0
lion137 napisał(a):

Wierzę Ci bo to zadanie jest łatwe. Rozumiem, że elementy ciągu mają być w tablicy, to umieszczenie w pętli:
fib[i]=fib[i-1]+fib[i-2]
raczej nie pomoże:)
A gdyby tak zacząć od:

x = 2
y = 1

a potem w pętli przypisywać:

x <- x + y
y  <- x // tu musi być "stare" x

Widać, że będą to kolejne wyrazy ciągu, teraz tylko zamiast x - ów i y - ków odpowiednie elementy tablicy i już:)

Tak zrobiłem poprzednio, bez użycia tablic na samych zmiennych typu int i pętli while i działa, ale jak próbuję to przenieść na tablice i zamiast tego posłużyć się pętlą for to niestety już nie wychodzi. Cóż chyba trzeba się pogodzić z tym, że najprostsze rozwiązania okazują się najlepsze ;). Dzięki wszystkim za zainteresowanie!

0

Naprawdę? Musi działać, Patrz (w pseudokodzie, trochę wygląda jak python:)):

A = [2, 1]
F = []
for x in range(10):
    tmp = A[0]
    A[0] = A[0] + A[1]
    A[1] = tmp
    F.append(A[1])
    
print(F) #-> [2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

for x in range(10) znaczy iteruj 10 razy, tablica A to te liczby x i y, zaczynające się od 2, 1; dodajemy kolejny wyrazy ciągu Fibonacciego do tablicy F; tutaj A[1] to jego kolejne elementy

1 użytkowników online, w tym zalogowanych: 0, gości: 1