如何解决这个问题来编写一个使用while循环来计算前n个Fibonacci数的程序

时间:2011-09-28 15:52:27

标签: c++ while-loop fibonacci do-while

我是C ++编程的新手,我有点迷茫。这是我想要做的和我的代码。关于该怎么做的任何想法?

编写一个使用while循环的程序来计算前n个Fibonacci数。回想一下数学上斐波纳契数列的以下定义:

  

Fibonacci数Fn定义如下。 F0为1,F1为1,Fi + 2 = Fi + Fi + 1,i = 0,1,2,....换句话说,每个数字是前两个数字的总和。前几个Fibonacci数是1,1,2,3,5,8和13.

程序应提示用户输入n(斐波纳契数的数量)并将结果打印到屏幕上。如果用户输入n的无效值(n <= 0),则打印错误消息并要求用户重新输入n(n的输入验证循环)。这必须是一个循环,而不是像Lab 2那样的if语句。

输出应类似于以下内容:

输入要计算的斐波纳契数的数量:3 前3个Fibonacci数字是: 1 1 2

#include <iostream>
using namespace std;
int main()
{
    int f0 = 0, f1  = 1,f2= 2, i = 0, n;
    cout << "Enter the number of Fibonacci numbers to compute: ";
    cin >> n;
    if ( n <= 0)
    {
        cout <<"Error: Enter a positive number: ";
        return 1;
    }
    while ( i < n){
        f2 = f0 + f1;
        i++;
    }

    cout << "The first " << n << " Fibonacci numbers are: " << endl;
    cin >> n;
    return 0;
}

5 个答案:

答案 0 :(得分:2)

 while ( i < n){
        f2 = f0 + f1;
        i++;
    }

看到这个循环,这就是问题所在,因为这是家庭作业,我不会确切地说出问题是什么,拿笔和纸,然后开始执行你的陈述,特别是这个循环,你会发现你的错误。只是提示,斐波那契数是前两个斐波纳契数的总和。

答案 1 :(得分:0)

你有f2=f0+f1权利。但是,您应该注意,当您增加i时,f2变为f1f1变为f0

如果你这样命名,那就更有意义了:

int f_i_minus_2 = 0, f_i_minus_1 = 1, f_i;

你会有

f_i = f_i_minus_1+f_i_minus_2;

现在,假设i是3.您已经写过:

f[3] = f[2]+f[1]

当您增加i时,您必须:

f[4] = f[3]+f[2]

f_i代替f_i_minus_1,而f_i_minus_1放在f_i_minus_2的位置。

(看看这个:

f[3] = f[2] + f[1]
 |       |
  \_____  \____
        \      \
f[4] = f[3] + f[2]

因此,在计算f_i后需要两个作业:

f_i_minus_2 = f_i_minus_1;
f_i_minus_1 = f_i;

请注意,我首先将f_i_minus_2更改为f_i_minus_1,因为第二项分配会破坏f_i_minus_1的值。

答案 2 :(得分:0)

根据维基百科,你的定义是关闭的。 F0 = 0,F1 = 1,F2 = 1,F3 = 2,......

http://en.wikipedia.org/wiki/Fibonacci_number

假设维基百科是对的,你的循环基本上是

int i = 0, f, fprev;
while( i < n )
{
    if( i == 0 )
    {
        f = 0;
        fprev = 0;
    }
    else if( i == 1 )
    {
        f = 1;
    }
    else
    {
        int fnew = f + fprev;
        fprev = f;
        f = fnew;
    }
    i++;
}

答案 3 :(得分:0)

如果您有兴趣,可以better ways to calculate it

答案 4 :(得分:0)

正如其他人所指出的,因为你永远不会修改f0f1 循环,f2不会取决于通过的次数 环。因为你必须输出最后的所有数字, 为什么不尝试将它们保存在一个数组中。我初始化前两个 手动值,然后循环,直到我有足够的值。

(使用STL可以很好地完成:

//  After having read n...
std::vector<int> results( 2, 1 );
while ( results.size() < n )
    results.push_back( *(results.end() - 1) + *(results.end() - 2));

然而,我不确定这是教练正在寻找的东西。 我宁愿怀疑他希望你自己做一些索引。只是 请记住,如果您手动初始化前两个值,那么 index必须从2开始,而不是从0开始。)

另一件事:你发布的规范说你应该循环if 用户输入非法值。这实际上有点棘手:如果 用户输入的内容不是int(比如“abc”),然后1) std::cin将保持错误状态(并且所有进一步的输入都将失败) 直到清除(通过调用std::cin.clear()),并且非法 不会从流中提取字符,因此您的下一次尝试 在你删除它们之前会失败。 (我建议>>进入 std::string为此;将删除所有东西,直到下一个白色 空间。)并且永远不会访问您>>编辑的变量,直到 如果输入失败,您已检查流是否失败。如果 输入失败,输入的变量不会被修改。如果,就像你在这里一样 没有初始化它,那么任何事情都可能发生。

最后(我确信这超出了你的任务),你真的这么做了 需要做些什么来检查溢出。超过某一点, 你的输出会或多或少随机;最好停下来 你在这种情况下放弃的输出。