我正在使用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;
答案 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