我是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;
}
答案 0 :(得分:2)
while ( i < n){
f2 = f0 + f1;
i++;
}
看到这个循环,这就是问题所在,因为这是家庭作业,我不会确切地说出问题是什么,拿笔和纸,然后开始执行你的陈述,特别是这个循环,你会发现你的错误。只是提示,斐波那契数是前两个斐波纳契数的总和。
答案 1 :(得分:0)
你有f2=f0+f1
权利。但是,您应该注意,当您增加i
时,f2
变为f1
而f1
变为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)
正如其他人所指出的,因为你永远不会修改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));
然而,我不确定这是教练正在寻找的东西。 我宁愿怀疑他希望你自己做一些索引。只是 请记住,如果您手动初始化前两个值,那么 index必须从2开始,而不是从0开始。)
另一件事:你发布的规范说你应该循环if
用户输入非法值。这实际上有点棘手:如果
用户输入的内容不是int
(比如“abc”),然后1)
std::cin
将保持错误状态(并且所有进一步的输入都将失败)
直到清除(通过调用std::cin.clear()
),并且非法
不会从流中提取字符,因此您的下一次尝试
在你删除它们之前会失败。 (我建议>>
进入
std::string
为此;将删除所有东西,直到下一个白色
空间。)并且永远不会访问您>>
编辑的变量,直到
如果输入失败,您已检查流是否失败。如果
输入失败,输入的变量不会被修改。如果,就像你在这里一样
没有初始化它,那么任何事情都可能发生。
最后(我确信这超出了你的任务),你真的这么做了 需要做些什么来检查溢出。超过某一点, 你的输出会或多或少随机;最好停下来 你在这种情况下放弃的输出。