2017-04-11 51 views
0

輸入我想寫這個程序,但我認爲我在邏輯上犯了一些錯誤。 This is my code。好的,所以我運行一個週期來收集所有的ODD數字,但我的最後一個數字是0或一些垃圾值。我對C++相當陌生,我花了更多時間在C上,我假設我沒有使用vector類,或者我的邏輯是垃圾。我花了很多時間,我無法弄清楚。我相信這是一個非常簡單的解決方案,但我看不出我做錯了什麼。謝謝你的時間!編寫一個程序,計算並輸出前N個奇數Fibonacci數字,用逗號和空格分隔。 N是從標準輸入

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; 
} 
+4

請不要張貼您的代碼的截圖,只需將其粘貼在您的文章! – hlt

+0

我嘗試了幾次,但它得到所有搞砸了,我很抱歉:(。 –

+0

@GiboGibonski檢查[這篇文章](https://meta.stackoverflow.com/a/251362/5610030),看看你怎麼可以正確地爲你的問題添加代碼 – Shogunivar

回答

0

問題是這樣的:第一個for循環運行num次,這個時間不夠長,無法找到num很多條目的holder。那意味着holder.size() < num。在你的第二個for循環中,你重複的次數甚至超過num,這意味着你在向量中進行了非法訪問,即使它有很多條目(因爲c會變得和num一樣大)不是合法的索引)。由於push_back將向量放大爲2,所以它們是技術上有效的條目,但包含垃圾數據,如您所見。

簡單的解決方法:

while(holder.size() < num){交換for (i = 0, i < num; i++) {。 (而num+1num在第二個循環中)

此外,您可能還想通過for(unsigned int c=0; c < holder.size(); c++){交換for (c = 0; c < num + 1; c++) {。保持大小正確是矢量類的職責,不應該從外部完成,這兩個循環是不同的操作。

順便說一下,開始在最小範圍內聲明變量(例如循環中的for循環迭代器),然後用邏輯步驟劃分程序,例如具有函數vector<int> create_odd_fibonacci_numbers(const unsigned int amount);void print_vector(const vector<int>& vec);。使調試更容易。也許不在這個小例子中,但你只是想用這種方式來使用它。

+0

現在很有意義。非常感謝你,仍然是一個小問題 - 它有一個運行時錯誤。我試着調試它,程序在達到while循環時崩潰。這是關於條件holder.size

+0

http://www.cpp.sh/9md4j <<<對我來說工作得很好。你把括號放在後面?數字是否設置?給出實際的代碼和錯誤消息。 – Aziuth

+0

我發現我的錯誤,我不知怎的搞砸了循環。現在一切都運行良好。非常感謝您的幫助! –

1

替換這個循環,而打印值

for(c=0;c<num;c++){ 
       cout << holder[c] << "," << " "; 
      } 
+0

如果我輸入3或4,可以工作。但是每次我輸入更大的東西就像5或6,我再次得到垃圾值。例如,如果我輸入5我得到1,1,3,5,[垃圾值]。如果我輸入6我得到:1,1,3,5,13,[垃圾值]。可以這是一個問題,在向量的最後一項內存中的某個地方?無法真正弄清楚什麼是錯誤的。 –

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次,我確信自己不會有任何垃圾放入向量中。儘管如此,我還是在向量中保存了更多的東西,浪費了無用的內存。它有效,但我認爲它可以更有效率。很高興看到你們的想法。

相關問題