Javascript N可以表示为js中K因子乘积的方式数
给出一个数N,它的所有因子的数组,一个数K。。。我们需要找到许多方法,其中N可以表示为K因子的乘积,即。 如果 所以方法的数量应该是7,因为Javascript N可以表示为js中K因子乘积的方式数,javascript,arrays,node.js,algorithm,sorting,Javascript,Arrays,Node.js,Algorithm,Sorting,给出一个数N,它的所有因子的数组,一个数K。。。我们需要找到许多方法,其中N可以表示为K因子的乘积,即。 如果 所以方法的数量应该是7,因为 1x1x64=64 1x2x32=64 1x4x16=64 1x8x8=64 依此类推要从数组中获得长度为k的组合,我们可以使用递归生成器: function* combinations(array, k, i = 0, prepend = []) { if(!k) { yield prepend; } else { while(
1x1x64=64
1x2x32=64
1x4x16=64
1x8x8=64
依此类推要从数组中获得长度为
k
的组合,我们可以使用递归生成器:
function* combinations(array, k, i = 0, prepend = []) {
if(!k) {
yield prepend;
} else {
while(i < array.length)
yield* combinations(array, k - 1, i /*+ 1*/, prepend.concat(array[i++]));
}
}
现在我们只需要将它们相乘:
const multiply = array => array.reduce((a, b) => a * b);
并过滤掉N:
[...combinations(arr, K)].filter(el => multiply(el) === N).length
将返回7
PS:是的,有更简单更快的方法,但有时我只想使用一些罕见的(但很酷的)语言功能:)这将创建一个包含所有非重复组合的2D数组
var n = 64
var factors = [1, 2, 4, 8, 16, 32, 64]
var rep = []
for (var f1 = 0; f1 < factors.length; f1++) {
for (var f2 = 0; f2 < factors.length; f2++) {
for (var f3 = 0; f3 < factors.length; f3++) {
if (factors[f1]*factors[f2]*factors[f3] == n && factors[f3] >= factors[f2] && factors[f2] >= factors[f1]) {
rep.push([factors[f1], factors[f2], factors[f3]])
}
}
}
}
console.log(rep.length) // Get the amount of combinations
var n=64
var因子=[1,2,4,8,16,32,64]
var rep=[]
对于(变量f1=0;f1=因子[f2]&因子[f2]>=因子[f1]){
代表推力([系数[f1]、系数[f2]、系数[f3])
}
}
}
}
console.log(rep.length)//获取组合的数量
让我们看看N作为素因子的分解。它看起来像:
式中a1,a2。。ax是N的主要因子。我们可以进一步将该公式扩展为:
为了产生问题所需的K因子,我们必须从上面列出的素数中选取。任何素数都可以以任何顺序选取,因此基本上在这个公式中,我可以用一个抽象符号替换素数
有多少种方法可以将N拆分为K个数的乘积?正如将这些下划线分组为K组的许多方法一样,每个K数字对应一组。对于第一个下划线,有K种可能将其分配给一个组;类似地,每个下划线都有K个可能性。总的来说,可能性的数量是
[这基本上是一个分区问题:我们将b1+b2+…+bx项分成K个集合]
现在唯一剩下的问题是确定N分解成素因子。或者,更好的是,直接确定b1+b2+…+bx之和
counter=0;
for(int i=2;i<square_root(N);i++)
if(N%i==0) //i is a divisor of N
{
int M=N;
while(M%i==0)
{
counter++;
M=M/i;
}
}
计数器=0;
对于(int i=2;过去几天有很多类似的问题。同一个讲师或在线竞赛?因为你的答案是N,那么它的因子数组是多余的;你可以推断出来。第二个方面-tag node.js真的不相关-javascript足以指定实现语言
var n = 64
var factors = [1, 2, 4, 8, 16, 32, 64]
var rep = []
for (var f1 = 0; f1 < factors.length; f1++) {
for (var f2 = 0; f2 < factors.length; f2++) {
for (var f3 = 0; f3 < factors.length; f3++) {
if (factors[f1]*factors[f2]*factors[f3] == n && factors[f3] >= factors[f2] && factors[f2] >= factors[f1]) {
rep.push([factors[f1], factors[f2], factors[f3]])
}
}
}
}
console.log(rep.length) // Get the amount of combinations
counter=0;
for(int i=2;i<square_root(N);i++)
if(N%i==0) //i is a divisor of N
{
int M=N;
while(M%i==0)
{
counter++;
M=M/i;
}
}