(#include"num_sequence.h"如下)
#pragma once
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
using namespace std;
class num_sequence {
public:
virtual ~num_sequence(){}
virtual int elem(int pos) const = 0;
virtual const char* what_am_i() const = 0;
static int max_elems() { return _max_elems; }
virtual ostream& print(ostream &os = cout) const = 0;
protected:
virtual void gen_elems(int pos) const = 0;
bool check_integrity(int pos, int size) const;
const static int _max_elems = 1024;
};
bool num_sequence::check_integrity(int pos, int size) const {
if (pos <= 0 || pos > _max_elems) {
cerr << "!!invalid position: " << pos
<< "cann't honor request.\n";
return false;
}
if (pos > size) {
gen_elems(pos);
}
return true;
}
ostream& operator<<(ostream &os, const num_sequence &ns) {
return ns.print(os);
}
#include"num_sequence.h"
class Fibonacci:public num_sequence
{
public:
Fibonacci(int len = 1, int beg_pos = 1) :_length(len), _beg_pos(beg_pos) {};
virtual int elem(int pos) const;
virtual const char* what_am_i() const { return "Fibonacci"; }
virtual ostream& print(ostream &os = cout)const;
int length() const { return _length; }
int beg_pos() const { return _beg_pos; }
protected:
virtual void gen_elems(int pos)const;
int _length;
int _beg_pos;
static vector<int> _elems;
};
vector<int> Fibonacci::_elems;//很重要,初始化
int Fibonacci::elem(int pos)const {
if (!check_integrity(pos, _elems.size()))
return 0;
if (pos > _elems.size())
Fibonacci::gen_elems(pos);
return _elems[pos - 1];
}
void Fibonacci::gen_elems(int pos)const {
if (_elems.empty()) {
_elems.push_back(1);
_elems.push_back(1);
}
if ((unsigned)pos >= _elems.size()) {
int ix = _elems.size();
int n2 = _elems[ix - 2];
int n1 = _elems[ix - 1];
for (; ix < pos; ix++) {
int elem = n2 + n1;
cout << "gen_elems: " << elem << endl;
_elems.push_back(elem);
n2 = n1;
n1 = elem;
}
}
}
ostream& Fibonacci::print(ostream &os)const {
int elem_pos = _beg_pos - 1;
int end_pos = elem_pos + _length;
if ((unsigned)end_pos > _elems.size())
Fibonacci::gen_elems(end_pos);
cout << "(" << _beg_pos << "," << _length << ")";
while (elem_pos < end_pos)
{
os << _elems[elem_pos++] << ' ';
}
return os;
}
ostream& operator<<(ostream &os, const Fibonacci &fbi) {
return fbi.print(os);
}
inline void display(const num_sequence &ns, int pos, ostream &os = cout) {
os << "The element at position : " << pos << " for the " << ns.what_am_i() << " sequence is: "
<< ns.elem(pos) << endl;
}
int main() {
Fibonacci fib;
cout << "fib:beginning at element 1 for 1 element: \n"
<< fib << endl;
Fibonacci fib2(16);
cout << "fib2:beginning at element 1 for 16 element: \n"
<< fib2 << endl;
Fibonacci fib3(8, 12);
cout << "fib3:beginning at element 8 for 12 element: \n"
<< fib3 << endl;
const int pos = 9;
Fibonacci fib4;
display(fib4, pos, cout);
return 0;
}