Czy liczba jest sumą maks 4 liczb Fibonacciego

0

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.

  1. 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)
  2. Jesli liczba bedzie wieksza niz ostatnia liczba F w tablicy i napotka na te zera to program się chyba psuje
  3. 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;
}
0
#include <iostream>
#include <iomanip>
using namespace std;

unsigned long long fib(unsigned n)
  {
   static unsigned long long F[94]={1,1};
   if(n>=94) return 0;
   if(!F[n]) F[n]=fib(n-1)+fib(n-2);
   return F[n];
  }

int main()
  {
   for(unsigned i=0;i<94;++i)
     {
      cout<<setw(3)<<i<<setw(22)<<fib(i)<<endl;
     }
  }

Jak widać przy 93 już masz przepełnienie.
Jak chcesz sprawdzać dalej to musisz zacząć od własnej arytmetyki lub użycia jakaś biblioteka typu BigInt

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