我正在尝试编写这个程序,但我认为我在逻辑上犯了一些错误。 This is my code。好的,所以我运行一个循环来收集所有的ODD号码,但我的最后一个号码是0或一些垃圾值。我对c ++很新,我花了更多的时间在C上,我假设我没有使用向量类,或者我的逻辑是垃圾。我花了很多时间,但我无法弄明白。我相信这是一个非常简单的解决方案,但我看不出我做错了什么。谢谢你的时间!
main()
{
int num; // how many odd numbers the user wants to see
int first = 0; // first fibonacci number
int second = 1; // second fibonacci number
int next = 0; // basically the sum of the previous two numbers
vector<int> holder; // a place to store the odd numbers
holder.push_back(second); // adding 1, otherwise we would miss it
cout << "How many ODD numbers would you like to see?:";
cin >> num; // taking user's input
int c, i;
for (i = 0, i < num; i++) {
next = first + second;
first = second;
second = next;
if ((next % 2) != 0) {
holder.push_back(next);
}
}
for (c = 0; c < num + 1; c++) {
cout << holder[c] << "," << " ";
}
return 0;
}
答案 0 :(得分:1)
在打印值时替换此循环
for(c=0;c<num;c++){
cout << holder[c] << "," << " ";
}
答案 1 :(得分:0)
#include <iostream>
#include <vector>
using namespace std;
int fibonacciRecursion(int n){
if(n==1||n==2){
return 1;
}
return fibonacciRecursion(n-1)+fibonacciRecursion(n-2);
}
main()
{
int num; // sum of how many numbers the user wants to see
int i,c; // loop variable
vector<int> holder;
cout << "how many odd fibonacci numbers do you want to see:";
cin >> num;
for (i=1; i <= num*2; i++){
if((fibonacciRecursion(i)%2)!=0){
holder.push_back(fibonacciRecursion(i));
}
}
for(c=0;c<num;c++){
cout<<holder[c] << "," << " ";
}
return 0;
}
我想我想出了一个解决方案,但我认为它不是很有效。所以我运行循环num * 2倍,似乎错误就在那里。因为我们只保存奇数,但我忘记了循环仍然通过,然后一些垃圾值位于向量的最后一个插槽中。因此,通过运行num * 2而不是num次,我有点保证自己不会在向量中放置任何垃圾。不过,我在矢量中保存了更多项目,浪费了内存。它有效,但我认为它可以更有效率。很高兴看到你们的想法。
答案 2 :(得分:0)
问题是:第一个for循环运行num
次,这不足以找到num
holder
个holder.size() < num
个条目。这意味着num
。在你的第二个for循环中,你甚至迭代一个多于num
的数字,这意味着你在向量中进行非法访问,即使它有c
个条目,你也会这样做(因为{ {1}}会变得与num
一样大,这不是合法索引。由于push_back将向量扩大到2的势能,如果它放大它,那些是技术上有效的条目,但是包含你看到的垃圾数据。
简单修复:
与for (i = 0, i < num; i++) {
交换while(holder.size() < num){
。 (并且num+1
在第二个循环中带num
)
此外,您可能希望通过for (c = 0; c < num + 1; c++) {
交换for(unsigned int c=0; c < holder.size(); c++){
。保持大小正确是向量类的责任,不应该从外部完成,这两个循环是不同的操作。
顺便说一下,开始在尽可能小的范围内声明变量(例如循环中的for循环迭代器)并按逻辑步骤划分程序,比如有一个函数vector<int> create_odd_fibonacci_numbers(const unsigned int amount);
和void print_vector(const vector<int>& vec);
。使调试更容易。也许不是在这个小例子中,但你只是想习惯这样做。