js大数相乘

情境

请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

一道简单题,遇到了大数相乘的情况,发现js的大数相乘,然后模10^9 + 7结果并不准确
怎么模都不准确,在所有可能出现大数的地方添加模

/**
 * @param {number} n
 * @return {number}
 */
var numPrimeArrangements = function (n) {
  // 质数个数全排列 * 非质数个数全排列
  const isPrime = new Array(n + 1).fill(1)
  let res = 0
  for (let i = 2; i <= n; i++) {
    if (isPrime[i]) {
      res++
      for (let j = i * i; j <= n; j += i) {
        isPrime[j] = 0
      }
    }
  }
  return ((sum(res) % (10 ** 9 + 7)) * (sum(n - res) % (10 ** 9 + 7))) % (10 ** 9 + 7)
};

const sum = (n) => {
  let res = 1
  for (let i = 2; i <= n; i++) {
    res *= i
    res = res % (10 ** 9 + 7)
  }
  return res
}

看了题解发现javascript没有使用bigint数据类型

Bigint

ES2020提出
BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。

使用 typeof 测试时, BigInt 对象返回 bigint

typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true

使用 Object 包装后, BigInt 被认为是一个普通 "object"

typeof Object(1n) === 'object'; // true

数字后面添加n,表示BigInt
1211332132143432432423424n

直接使用Bignt()方法包裹的数字会变成BigInt

使用BigInt后

/**
 * @param {number} n
 * @return {number}
 */
var numPrimeArrangements = function (n) {
  // 质数个数全排列 * 非质数个数全排列
  const isPrime = new Array(n + 1).fill(1)
  let res = 0
  for (let i = 2; i <= n; i++) {
    if (isPrime[i]) {
      res++
      for (let j = i * i; j <= n; j += i) {
        isPrime[j] = 0
      }
    }
  }
  return (sum(res) * sum(n - res)) % 1000000007n
};

const sum = (n) => {
  let res = 1
  for (let i = 2; i <= n; i++) {
    res *= i
    res = res % (10 ** 9 + 7)
  }
  return BigInt(res)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值