/********************************************************************** * Fib - setFibNumber * Inputs: n (int) * Calculates the n-th Fibonacci number ***********************************************************************/ void Fib::setFibNumber(int n) { if (n < 1) { cout << "Fibonacci subscript cannot be less than 1\n"; return; } /*need to clear fibNumber. setFibNumber() may be called several times on an object and you would have problems if you didn't erase all previous data*/ fibNumber.clear(); fibNumber.insert(1,0); // fibNumber will start as f1. f1 = 1; fibSubscript = n; if (n < 3) // can return here if n is 1 or 2. return; DLList<int> f2; f2.insert(1,0); // fibNumber(aka f1) = 1 and f2 = 1. We are rdy to start. Node<int>* p1;// traversal pointers for DLList objects fibNumber(f1) and f2 Node<int>* p2; int temp = 0; // used as f1's node value placeholder. int carry = 0; for (int i = 0; i < n - 2; i++) //run n - 2 times. f1 and f2 done already { //reset pointers to respective beginnings of lists. reset carry to 0 p1 = fibNumber.getFirstNode(); p2 = f2.getFirstNode(); carry = 0; //Add both lists. fibNumber becomes sum, f2 becomes what fibNumber was while (p1 != NULL) { temp = p1->getData(); p1->setData((p1->getData() + p2->getData() + carry) % 1000000000); carry = (temp + p2->getData()) / 1000000000; p2->setData(temp); p1 = p1->getNext(); p2 = p2->getNext(); } if (carry == 1) // Account for carry on addition of final nodes. { fibNumber.insert(1, fibNumber.getNumItems()); f2.insert(0, f2.getNumItems()); } } }
/********************************************************************** * Fib::display() - Displays the Fibonacci number. ***********************************************************************/ void Fib::display() { if (fibSubscript == 0) { cout << "Use setFibNumber() to initialize object\n"; return; } Node<int>* trav = fibNumber.getFirstNode(); while (trav->getNext() != NULL) // traverse to the end of the list trav = trav->getNext(); cout << trav->getData();//display most significant node without setw/setfill trav = trav->getPrevious(); while (trav != NULL) //traverse list in reverse and display w/ setw/setfill { cout << setw(9) << setfill('0') << trav->getData(); trav = trav->getPrevious(); } }