编写一个程序,计算并输出前面的N个奇数斐波纳契数,用逗号和空格分隔。从标准输入输入N.

时间:2017-04-11 08:50:14

标签: c++ fibonacci

我正在尝试编写这个程序,但我认为我在逻辑上犯了一些错误。 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;
}

3 个答案:

答案 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 holderholder.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); 。使调试更容易。也许不是在这个小例子中,但你只是想习惯这样做。