读书人

自学C++做书后一道题时出了点有关问

发布时间: 2012-09-12 09:21:30 作者: rapoo

自学C++,做书后一道题时出了点问题
问题是让求出Fibonacci数列第n项,其数列特点是前两项都是1,以后每项是前两项之和
我是这么写的

C/C++ code
#include "stdafx.h"#include <iostream>using namespace std;int main(){    int a[3] = {0,1,1};    int n = 0,m = 0;       //n第n项    while(n!= 2008)        //为了测试方便,可以多次输入    {    cin>>n;    if(n==1)    {        cout<<a[1]<<endl;    }    else if(n==2)    {        cout<<a[2]<<endl;    }    else    {        while(m!=n-2)               {                a[0] = a[1];                a[1] = a[2];                a[2] = a[0] + a[1];                                m = m+1;            }        cout<<a[2]<<endl;            }        }    system("pause");        return 0;}

开始我用的
while(n!=2008)
{
.....
}
是为了可以多次输入。

运行的时候,如果n是按大小顺序来输的话,比如:1,2,4,5,8这样,结果是正确的。如果得出第10项结果后想查看第6项的结果,答案就有可能出错。 还有就是连续输入几次之后有可能就会出现无响应的感觉,不能输入,按Enter键也没反应。 请高手们帮忙修改一下

[解决办法]
原因在于你的数组a中的元素有累积的效应:
C/C++ code
#include <iostream>using namespace std;unsigned long fibo(unsigned long n){    if(n == 0 || n == 1)    {        return n;    }    else    {        return fibo(n - 1) + fibo(n - 2);    }}int main(int arg, char* argv[]){    unsigned long n = 0;    while(n != 2008)    {        cin >> n;        cout << fibo(n) << endl;    }    return 0;}
[解决办法]
LS递归是很经典的方法,不过缺点也很明显,就是一旦数据量过大就会导致运行时间很长。
贴个我自己写过的循环代码:
C/C++ code
#include <iostream>using namespace std;long fib(int n);void main(){    int num;    while(cin>>num)        cout<<"The nth num in Fibonacci is: "<<fib(num)<<endl;}long fib(int n){    long x = 0, y = 1;    for (int j = 1; j < n; j++)    {        y = x + y;        x = y - x;    }    return y;}
[解决办法]
用一个位集标识一下哪个位置的元素被计算过了,就直接得到就好了,加不了多少代码

读书人网 >C++

热点推荐