Witam w ten piękny dzień. Mam takie zadanie: Napisać program, który wczytuje wprowadzoną z klawiatury liczbę naturalną i odpowiada na pytanie, czy liczba ta jest sumą co najwyżej czterech liczb Fibonacciego.
Program napisałem i...działa, ale nie do końca i mam parę pytań, wątpliwości oraz nie jestem przekonany co do "poprawności" tego algorytmu.
- Przede wszystkim jaki rozmiar tablicy ustawiać w takich przypadkach skoro nie wiem ile będzie tych liczb w tablicy? W programie dałem np. maks/50 bo na pewno więcej nie będzie (przy maks = 1000 zostaną dwa puste miejsca co sprowadza się do następnego pytania)
- Jesli liczba bedzie wieksza niz ostatnia liczba F w tablicy i napotka na te zera to program się chyba psuje
- Na końcu nie podoba mi się to, że sprawdzam sume do konca tablicy(i>=0), nie wiem jak zrobić tak żeby sprawdzalo maks do 5 w tył, tylko co w przypadku gdy tych 5 nam zabraknie? Wyjdzie poza tablicę?
#include <iostream>
#include <cstdlib>
const int maks = 1000;
using namespace std;
int main() {
int a, b, i, suma = 0, licz_sum = 0; //a, b - do kolejnych liczb Fibonacciego, suma - suma liczb, licz_sum - licznik zsumowanych liczb
int tab[maks / 50];
for (int k = 0; k < maks / 50; k++) { //zerowanie tablicy
tab[k] = 0;
}
a = 1;
b = 1;
i = 0;
//wypelnianie tablicy kolejnymi liczbami Fibonacciego
while (b < maks && a < maks) {
tab[i] = a;
i++;
tab[i] = b;
i++;
a = a + b;
b = a + b;
}
int liczba;
cin >> liczba;
bool x = false;
for (i = 2; i < maks / 50; i++) {//sprawdzamy czy liczba jest ktoras z liczb Fibonacciego, jesli tak to wypisujemy
if (liczba == tab[i]) {
cout << "tak";
return 0;
}
if (liczba < tab[i]) { // znajdujemy 'polozenie' tej liczby w tablicy
i = i - 2; //-1 poniewaz jestesmy teraz tak jakby za ta liczba i dodac -1 bo na pewno suma 2 poprzednich
x = true; //bedzie wieksza niz ta liczba o ile nie jest ona jedna z liczb F.
break; //ale to sprawdzilismy wczesniej
}
}
if (x) {
for (i; i >= 0; i--) { //
suma = suma + tab[i];
licz_sum = licz_sum + 1;
if (suma == liczba ) {
if (licz_sum <= 4) { //"co najwyzej czterech kolejnych liczb F."
cout << "\ntak" << endl;
break;
}
}
}
}
system("pause");
return 0;
}