Javascript N可以表示为js中K因子乘积的方式数

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(

给出一个数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(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;
               }
       }