为什么JS函数在C ++中返回不同的结果?

时间:2016-11-21 08:14:43

标签: c++

一个谜语:

您有3个目录。每个都包含2个目录。每个目录都包含1个目录,这些目录都是空的。你有几个目录?

我写了一个JavaScript函数来解决它......

NAs

...并返回正确的结果:

function catalogsNumber(c)
{ 
    n = 0;

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

    return n;
}

但是当我在C ++中尝试相同时,每当// Results in JavaScript catalogsNumber ( 3 ) => 15 catalogsNumber ( 4 ) => 64 catalogsNumber ( 5 ) => 325 catalogsNumber ( 12 ) => 1302061344 catalogsNumber ( 13 ) => 16926797485 catalogsNumber ( 14 ) => 236975164804 时,该函数都会返回奇怪的结果:

c > 12

这样的谜语,非常神秘。为什么会这样?

4 个答案:

答案 0 :(得分:2)

这是一个溢出:当用13调用时,结果不适合你的int变量。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

有溢出。您试图在整数处存储一个大于整数可以容纳的值的值。 javascript是有效的,因为它是一种无类型语言,所以你不要声明输出变量的类型,编译器找到自己并分配所需的内存。 要解决这个问题,在c / c ++中,你应该将变量声明为long或long long。 希望有所帮助:)

答案 3 :(得分:-1)

将i更改为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;
 }