李恒道 发表于 2024-10-1 00:06:02

2320. 统计放置房子的方式数 JavaScript计算出现问题

一开始我也是打的相乘
```js
var countHousePlacements = function (n) {
    const dp = new Array(n).fill(0)
    dp = 2;
    dp = 3;
    for (let index = 2; index < dp.length; index++) {
      dp = (dp + dp) % (1000000000 + 7)
    }
    return (dp*dp)% (1000000000 + 7)
};
```
但是发现不管怎么样都差了几百
没办法转成了dp
```js
var countHousePlacements = function (n) {
    const dp = new Array(n).fill(0).map(() => new Array(4).fill(0));
    dp = 1;//不存在房屋
    dp = 1;//存在房屋
    dp = 1;//上存在下不存在
    dp = 1;//上不存在下存在
    for (let index = 1; index < dp.length; index++) {
      dp = (dp + dp + dp + dp) % (1000000000 + 7)
      dp = dp % (1000000000 + 7)
      dp = (dp + dp) % (1000000000 + 7)
      dp = (dp + dp) % (1000000000 + 7)
    }
    let result = 0
    for (let index = 0; index < 4; index++) {
      result+=   dp

    }
    return result% (1000000000 + 7)
};
```
后来提交成功发现官解跟我的答案始终都差
根据调试发现应该是JS的浮点数计算跟其他的语言有不一致的情况
给数字后面加个n并且mod的数字也改为Bigint再跑就会出现正确答案
```js
var countHousePlacements = function (n) {
    const dp = new Array(n+1).fill(0n)
    dp = 1n;
    dp = 2n;
    for (let index = 2; index < dp.length; index++) {
      dp =( dp + dp) % (1000000000n + 7n)
    }
    return (dp*dp)% (1000000000n + 7n)
};
```
应该跟IEFI浮点数的标准实现有关,就不细究更多了,反正能过就行
页: [1]
查看完整版本: 2320. 统计放置房子的方式数 JavaScript计算出现问题