#include <iostream> #include <fstream> #include <string> #include <time.h> #include <list> using namespace std; int* Fibonacci (int &n) { static int F[]={0,0}; static int Fn[2]={0,2}; static int currF[2]={0,1},preF[2]={0,1}; static int d = 2; if (n == 0 ) return F; else if (n == 1) return preF; else if (n == 2) return preF; else { for(int i = 3; i!= n; ++i ) { Fn[1] = currF[1] + preF[1] ; if(Fn[1] > 9) { Fn[1] = Fn[1] % 10; Fn[0] = currF[0] + preF[0] + 1; } else Fn[0] = currF[0] + preF[0]; if(Fn[0] > 9) { Fn[1] = Fn[0] % 10; Fn[0] = 1; d++; } preF[0] = currF[0]; preF[1] = currF[1]; currF[0] = Fn[0]; currF[1] = Fn[1]; cout << "Fn = "<< Fn[0]<<Fn[1]<<endl; } return Fn; } } int main() { double start = clock(),end(0); for(int i = 1; i!=7; ++i) { int * p = Fibonacci (i); cout << "i"<< i<<endl; //cout << "Fibonacci ("<<i<<") : "<< *p++ << *p << endl; } end = clock(); double result = (end - start)/1000; cout.setf(ios::fixed); cout <<endl<< "3.00GHz's run time = " << result << "s."<<endl; return 0; } #include <iostream> #include <fstream> #include <string> #include <time.h> #include <list> using namespace std; long long Fibonacci (int &n) { long long Fn=2; long long currF=2,preF=1; if (n == 0 ) return 0; else if (n == 1) return 1; else if (n == 2) return 1; else { for(int i = 3; i!= n; ++i ) { Fn = currF + preF ; preF = currF; currF = Fn; } return Fn; } } int main() { double start = clock(),end(0); unsigned int F[]={0,0}; unsigned int Fn[2]={0,2}; unsigned int currF[2]={0,1},preF[2]={0,1}; unsigned int se1 = 0, se2 = 0; unsigned int d = 3; for(int i = 3; d!= 25 ; ++i ) { Fn[1] = currF[1] + preF[1] ; if(Fn[1] > 9) { Fn[1] = Fn[1] % 10; Fn[0] = currF[0] + preF[0] + 1; } else Fn[0] = currF[0] + preF[0]; if(Fn[0] > 9) { se2 = Fn[1]; se1 = currF[1]; Fn[1] = Fn[0] % 10; Fn[0] = 1; preF[0] = 0; preF[1] = currF[0]; d++; } else { preF[0] = currF[0]; preF[1] = currF[1]; } currF[0] = Fn[0]; currF[1] = Fn[1]; if(se1 + se2 > 9) { Fn[1]=Fn[1]+1; currF[1] = Fn[1]; } if(Fn[1]>9) { Fn[1]=0; Fn[0] = Fn[0]+1; currF[0] = Fn[0]; currF[1] = Fn[1]; } cout << "F" << i <<"= "<< Fn[0]<<Fn[1]<<" "<<Fibonacci(i)<< " " << d << endl; } /*for(int i = 1; i!=7; ++i) { */ //int * p = Fibonacci (i); //cout << "i"<< i<<endl; //cout << "Fibonacci ("<<i<<") : "<< *p++ << *p << endl; //} end = clock(); double result = (end - start)/1000; cout.setf(ios::fixed); cout <<endl<< "3.00GHz's run time = " << result << "s."<<endl; return 0; } 正解,未优化 #include <iostream> #include <fstream> #include <string> #include <time.h> #include <list> using namespace std; int main() { double start = clock(),end(0); int a[]= {0,1}; int b[] = {0,2}; list<unsigned int> tmp(b,b+2); list<unsigned int> cur(a,a+2); list<unsigned int> pre(a,a+2); int term = 1; //下标 size_t d = 1; //位数 for(int i = 1; d!= 1000 ; ++i ) { d = cur.size(); term ++; if(pre.size()<cur.size()) //如果两个数位数不足则补足 pre.push_front(0); //清空list,复制cur tmp.clear(); tmp.insert(tmp.begin(),cur.begin(),cur.end()); if(pre.size() == cur.size())//两个数相加的计算过程 { for(list<unsigned int>::reverse_iterator liter = pre.rbegin(),riter = cur.rbegin(); liter!= pre.rend() && riter!=cur.rend();liter++,riter++) { *riter =*liter + *riter; if( *riter > 9) { if((++riter) == cur.rend()) //这里必须++riter { riter--; if(*riter > 9) { *riter = *riter%10; cur.push_front(1); break; } riter++; } riter--; *riter = *riter%10 ; riter++; *riter = *riter + 1; riter--; } } pre.clear();//清空pre,复制tmp pre.insert(pre.begin(),tmp.begin(),tmp.end()); } } cout <<"the first term is " << term << endl; end = clock(); double result = (end - start)/1000; cout.setf(ios::fixed); cout <<endl<< "3.00GHz's run time = " << result << "s."<<endl; return 0; } long long f1=1,f2=1; int n=0,f=2; while(n<1000-15) { f2+=f1; f1=f2-f1; f++; if(f2>999999999999999){ f2/=10; f1/=10; n++; } }; cout <<"the first term is " << f << endl;