złe wyjście programu, wzór na króliki jest zły, może ktoś pomód mi go napisać?

0

Agnieszka dowiedziała się ostatnio, skąd wziął się ciąg Fibonacciego.
Mianowicie, uczony rozważał teoretyczny eksperyment dotyczący szybkości
rozmnażania się stada królików przy następujących założeniach:

  • na początku mamy jedną nowo narodzoną parę królików
  • każda nowa para staje się płodna po miesiącu życia
  • każda płodna para ma co miesiąc jedną parę potomstwa
  • króliki są nieśmiertelne.
    Wartość F(n) oznacza po prostu liczbę par królików po n miesiącach.
    Agnieszka
    zastanawia się teraz, jakie byłoby rozwiązanie analogicznego
    zagadnienia w przypadku gdyby każda para królików stawała się płodna
    dopiero po dwóch miesiącach, ale za to miała co miesiąc dwie nowe pary
    potomstwa.

Wejście

W pierwszej linii wejścia znajduje się jedna liczba całkowita t<=5 oznaczająca liczbę testów.
W kolejnych liniach znajdują się poszczególne testy. Każdy z nich składa się z jednej liczby całkowitej n (0<=n<=30).

Wyjście

Dla każdego testu wypisz w osobnej linii liczbę par królików otrzymanych po n miesiącach w eksperymencie Agnieszki.
Przykład

Wejście:
4
0
1
3
4

Wyjście:
1
1
3
5

 #include<iostream>
using namespace std;
int suma(int a)
{
int tab[a];
int c,d;
tab[0]=1;
tab[1]=1;
tab[2]=1;
if(a>2)
{ for(int i=2, d=1;i<a;i++,d++)

        tab[a]=1+(d*2);


}

return tab[a];

}

int main()

{   int pary[5];
    int t;
    cin >> t;
    if(t<=5)
    {
        for(int i=0;i<t;i++)
        {
            cin >> pary[i];
            if (pary[i]>30 || pary[i]<0)
            {
                i--;
            }
        }
        for(int i=0;i<t;i++)
        {
            cout << suma(pary[i])<< endl;
        }
    }

    return 0;
}

0

f(0) = 1
f(1) = 1
f(n) = f(n-1) + f(n-2) * 2

Rozwiazanie analityczne (o ile sie nie pomyliłem licząc je :P) :
f(n) = 1/2 * (1+sqrt(2))^n + 1/2 (1-sqrt(2))^n

0

dla 2 musi być też 1 bo rozmnażają się po 2mies czyli dla 3 jest 3

druga sprawa to króliki które się rozmnożyły od pierwszej pary tez się rozmnażają od 3mies

2

Czy musicie tak sobie życie utrudniać ?

  1. jeżeli ci powiedziano że ilość testów będzie mniej niż 5 to możesz wierzyć na słowo a nie sprawdzać to.
  2. jeżeli ci powiedziano że nie będzie więcej niż 30 miesięcy również - wierzyć na słowo
  3. jeżeli ci powiedziano jakie ma być wyjście to wcale nie oznacza że przy testach na konsole całe wyjście ma być razem.
  4. poczytaj o zasadach DRY & KISS

Oto całe rozwiązanie:

#include<iostream>
using namespace std;

int suma(int m) { return m<3?1:suma(m-1)+2*suma(m-3); }

int main() 
  {
   int t;
   cin>>t;
   while(t++)
     {
      int m;
      cin>>m;
      cout<<suma(m)<<endl;
     }
   return 0;
  }
0

pięknie działa, poprawiłem swój program
dzięki;)
mógłbyś mi wytłumaczyć ten wzór? bo nie bardzo go rozumiem;) jak on to oblicza?

0
marcin1mn napisał(a):

jak on to oblicza?

W ten sposób:

... każda para królików stawała się płodna dopiero po dwóch miesiącach, ale za to miała co miesiąc dwie nowe pary potomstwa.

0

chodzi mi o to ze chce zrozumieć ten kod

return m<3?1:suma(m-1)+2*suma(m-3)

np dla m=6

return m<3?1:suma(6-1)+2*suma(6-3)
na moją logike powinno być  suma(5)+2*suma(3)
czyli: 5+2*3= 11
a jest 13 ;)

1

Jeżeli nie odróżniasz to: suma(5)+2*suma(3)
od tego: 5+2*3
to zacznij porównywać znak po znaku.
Czy wg ciebie log(5)+2*log(3) też jest tym samym co 5+2*3 ?
A sin(5)+2*sin(3) ?

0

no właśnie ta "suma" nie pasuje mu nie wiem co ona oznacza
jestem początkujący i nie bardzo jeszcze to pojmuje :)

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