1

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

编写一个程序,使用 while 循环计算前 n 个斐波那契数。从数学中回忆斐波那契数列的以下定义:

斐波那契数 Fn 定义如下。F0 是 1,F1 是 1 并且 Fi+2 = Fi + Fi+1 对于 i = 0, 1, 2, ... 。换句话说,每个数字都是前两个数字的总和。前几个斐波那契数是 1、1、2、3、5、8 和 13。

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

输出应类似于以下内容:

输入要计算的斐波那契数:3 前 3 个斐波那契数是: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;
}
4

5 回答 5

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

看看这个循环,这就是问题所在,因为这是家庭作业,我不会确切地告诉你问题是什么,拿起笔和纸,开始执行你的语句,特别是这个循环,你会发现你的错误。只是一个提示,斐波那契数是前两个斐波那契数的总和。

于 2011-09-28T16:12:23.040 回答
0

正如其他人指出的那样,由于您从不修改f0并且f1在循环中,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));

但是,我不确定这是否是您的讲师正在寻找的。我宁愿怀疑他希望你对自己进行一些索引。请记住,如果您手动初始化前两个值,您的索引必须从 2 开始,而不是从 0。)

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

最后(我确信这超出了您的任务范围),您确实需要做一些事情来检查溢出。超过某个点,你的输出或多或少会变得随机;在这种情况下,最好停止并输出您要放弃的内容。

于 2011-09-28T17:03:33.930 回答
0

如果你有兴趣,有更好的方法来计算它

于 2011-09-28T16:20:01.627 回答
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++;
}
于 2011-09-28T16:17:06.657 回答
0

f2=f0+f1说得对。但是,您应该注意,当您增加 时i, thenf2变为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]

that is f_iput in the place off_i_minus_1f_i_minus_1is put in the place of 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_2f_i_minus_1是因为第二个赋值破坏了f_i_minus_1.

于 2011-09-28T16:12:50.217 回答