2016-11-21 126 views
-1

謎語:爲什麼JS函數在C++中返回不同的結果?

您有3個目錄。他們每個人都包含2個目錄。這些目錄中的每一個都包含1個目錄,而這些目錄都是空的。你有多少目錄?

我寫了一個JavaScript函數來解決它......

function catalogsNumber(c) 
{ 
    n = 0; 

    for (a = 0; a < c; a++) { 
     n = (n + 1) * (a + 1); 
    } 

    return n; 
} 

...它返回正確的結果:

// Results in JavaScript 
catalogsNumber (3) => 15 
catalogsNumber (4) => 64 
catalogsNumber (5) => 325 
catalogsNumber (12) => 1302061344 
catalogsNumber (13) => 16926797485 
catalogsNumber (14) => 236975164804 

但是,當我試圖在C++一樣,函數每次返回奇怪的結果當c > 12

int catalogsNumber(int c) 
{ 
    int i, n = 0; 

    for (i = 0; i < c; i++) { 
     n = (n + 1) * (i + 1); 
    } 

    return n; 
} 

// Results in С++ 
catalogsNumber (3) => 15    // correct 
catalogsNumber (4) => 64    // correct 
catalogsNumber (5) => 325    // correct 
catalogsNumber (12) => 1302061344  // correct 
catalogsNumber (13) => -253071699  // ¯\_(ツ)_/¯ 
catalogsNumber (14) => 751963524  // ¯\_(ツ)_/¯ 

這樣的謎語,很神祕。爲什麼會發生?

+2

嘗試在C++中將int更改爲long int。 – kometen

+0

因爲結果大於int值,所以它會返回-xxxxxx。改爲長時間而不是 –

+2

'長'不提供任何保證。在某些平臺上,long與int的寬度相同。使用'std :: int64_t'或'std :: uint64_t' – bolov

回答

1

問題是你正在溢出int變量n,其最大值爲2,147,483,647。

您需要使用更寬的類型。您可以使用unsigned int類型,這會使您的最大值增加一倍,但在這種情況下,這不會有多大幫助。所以更好的辦法是使用64位整數。

uint64_t catalogsNumber(int c) 
{ 
    int i=0; 
    uint64_t n = 0; 

    for (i = 0; i < c; i++) { 
     n = (n + 1) * (i + 1); 
    } 

    return n; 
} 
-1

將我更改爲short並將結果設置爲uint64_t,以便它不會發生溢出異常。你無法將值16926797485保存在一個int

int catalogsNumber(int c) 
{ 
// Change to long int instead of int or some other bigger datatype, 
// the value can't be stored inside an int 
    short i = 0; 
    uint64_t int n = 0; 

    for (i = 0; i < c; i++) { 
     n = (n + 1) * (i + 1); 
    } 

    return n; 
} 
+3

「long」與'int' – bolov

+2

相同的寬度來代替使用uint64_t。另外,你的'i'變量現在也是64位,(如果長度等於64位),那麼最好分割'i'和'n'的聲明。 –

2

這是一個溢出:當13叫,結果不適合在您int變量。

0

有溢出。您正嘗試在整數中存儲一個大於整數可以容納的值的值。 JavaScript的工作原理是因爲它是一種無類型的語言,因此您不會聲明輸出變量的類型,編譯器會發現它自己並分配所需的內存。 爲了解決這個問題,在c/C++中,你應該把變量聲明爲long或long long類型。 希望幫助:)