情境
请你帮忙给从 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)
}