2016-11-21 196 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类型。 希望帮助:)

相关问题