2015-09-07 106 views
-3

我在使用這個非遞歸斐波那契函數時遇到了一些麻煩。我使用這個數組數組並將它傳遞給FiboNR,但是我得到了大的負值和訪問衝突錯誤。C++斐波那契錯誤

int n[15] = { 1,5,10,15,20,25,30,35,40,45,50,55,60,65,70 }; 

int FiboNR(int n) // array of size n 
{ 
    int const max = 100; 
    int F[max]; 
    F[0] = 0; F[1] = 1; 
    for (int i = 2; i <= n; i++) { 
     F[n] = F[n - 1] + F[n - 2]; 
    } 
    return (F[n]); 
} 

功能是一個由教師提供的,我以爲它正確的,如果他給它,但這些內存錯誤,我不完全明白髮生了什麼事情。唯一的方法,我打電話在一個循環中通過陣列和輸出答案像cout << FiboNR(n[i]);

+3

環內容應該是'F [i] = F [I - 1] + F [我 - 2];' – Jarod42

+0

@ Jarod42這是該問題的解決方案,這是正確的答案,你爲什麼這樣做不要把它作爲答案嗎? – Kiloreux

+0

這似乎並沒有解決它,但是,我做了一個編輯,但即時通訊仍然收到相同的內存錯誤。 – nmorell

回答

0

首先,你的麻煩是循環。替換:

F[n] = F[n - 1] + F[n - 2]; 

有:

F[i] = F[i - 1] + F[i - 2]; 

因爲是你的迭代和ñ僅僅是極限。
只是供參考,大括號()在回報聲明是不需要的,你可以忽略它們。


我使用這個數字陣列,並把它傳遞給FiboNR

你不應該這樣做,因爲FiboNR()節選它的參數是一個整數(一個,而不是整數數組)。所以你應該只傳遞一個數字給你的函數,如:FiboNR(n[2])

0

由於int數組的int溢出(n> 46),您將得到一個負數。

將陣列類型從改爲int改爲long long

其他解決方案:將數組類型更改爲float/double類型,結果精度較低或使用長算術。

類型|典型的位寬|典型範圍

int | 4字節| -2147483648到2147483647

鏈接:C++ Data Types

的下面的代碼示例。

#include <iostream> 

long long FiboNR(int n);  

long long FiboNR(int n) { 
    int const max = 100; 
    long long F[max]; 

    if (n > max) { 
    n = max; 
    } 

    F[0] = 0; 
    F[1] = 1; 

    for (int i = 2; i <= n; i++){ 
    F[i] = F[i - 1] + F[i - 2]; 
    }  
    return (F[n]); 
}  

int main() { 

    for (int i=0; i < 100; i++) { 
    std::cout << "i = " << i << " : " << FiboNR(i) << std::endl; 
    } 
    return 0; 
} 
+0

輸入數組中的最大值是70對於帶符號的32位int,最大值是fib(46)= 1836311903,對於無符號32位int,最大值是fib(47)= 2971215073.如前所述,使用long long(64位int)將足夠大,因爲fib(92)= 7540113804746346429.對於unsigned long long,fib(93)= 12200160415121876738. – rcgldr

+0

rcgldr,是的,你說得對。我在問題中假設爲int。是的,對於n <= 92(n = 93:-6246583658587674878),使用「long long(64位int)」就足夠了。 – Maks