JavaScript对于相似的代码给出的结果与C ++不同

时间:2019-07-16 17:23:11

标签: javascript c++ arrays

我正在使用JavaScript解决涉及加泰罗尼亚语数字的DP问题。对于n = 35(第35个加泰罗尼亚语编号),我得到了错误的答案。所以我决定用C ++编写代码。我用C ++编写了类似的代码,令我惊讶的是我的代码通过了所有测试用例。为什么在C ++和JS中对于相似的代码我会得到不同的结果?

问题链接:https://www.interviewbit.com/problems/intersecting-chords-in-a-circle/

JS代码(犀牛1.7.7)

var arr = new Array(36);
arr[0] = 1;
arr[1] = 1;
arr[2] = 2;
for(var i = 3; i <= 35; i++) {
    arr[i] = 0;
    for(var j = 0; j < i; j++) {
        arr[i] += arr[j] * arr[i-j-1];
        arr[i] = arr[i] % 1000000007;
    }
}
print(arr[35]);

C ++

int main() {
long int arr[36];
    arr[0] = 1;
    arr[1] = 1;
    arr[2] = 2;
    for(int i = 3; i <= 35; i++) {
        arr[i] = 0;
        for(int j = 0; j < i; j++) {
            arr[i] += arr[j] * arr[i-j-1];
            arr[i] = arr[i] % 1000000007;
        }
    }
    cout<<arr[35];
return 0;
}

输入:35;
预期输出:93302951;
JavaScript输出:93302952;
C ++输出:93302951;

2 个答案:

答案 0 :(得分:3)

那是因为Javascript使用64位IEEE 754浮点数。如果将C ++代码更改为使用等效类型(双精度),则会得到相同的错误结果:

#include <iostream>
#include <cmath>

int main()
{
    double arr[36];
    arr[0] = 1;
    arr[1] = 1;
    arr[2] = 2;
    for(int i = 3; i <= 35; i++) {
        arr[i] = 0;
        for(int j = 0; j < i; j++) {
            arr[i] += arr[j] * arr[i-j-1];
            arr[i] = std::fmod(arr[i], 1000000007);
        }
    }
    std::cout << (int)arr[35];
    return 0;
}

打印:

  

93302952

答案 1 :(得分:3)

Max的回答很明确,因此可以考虑采取后续措施。 JavaScript现在具有BigInt名称下的[任意大]整数。您可以通过在数字文字上添加一个n后缀来创建文字版本。因此,等效于C版本的有效JS版本如下:

const array = new Array(36);

array[0] = 1n;
array[1] = 1n;
array[2] = 2n;

for (let i = 3; i <= 35; i++) {
    array[i] = 0n;

    for (let j = 0; j < i; j++) {
        array[i] += array[j] * array[i-j-1];
        array[i] = array[i] % 1000000007n;
    }
}

console.log(array[35]);

这将产生93302951n