javascript - js中N可以表示为K因子乘积的方式数
问题描述
给出一个数字 N,一个包含所有因子的数组,一个数字 K...我们需要找到可以将 N 表示为 K 个因子的乘积的多种方式,即如果
N=64
K=3
arr = [1,2,4,8,16,32,64]
所以方法的数量是 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++]));
}
}
(注释掉的 +1 是为了排除重复项(1 * 1 * 1
),但 OP 似乎不需要这种行为)
因此,要获得所有组合,我们可以这样做:
[...combinations([1, 2, 3, 4], 2)] // [1, 2], [1, 3] ...
现在我们只需要将它们相乘:
const multiply = array => array.reduce((a, b) => a * b);
并过滤掉那些是 N 的:
[...combinations(arr, K)].filter(el => multiply(el) === N).length
这将返回7
。
PS:是的,有更简单、更快捷的方法,但我有时只想使用一些罕见(但很酷)的语言特性 :)
推荐阅读
- javascript - 在已经存在的 objectStore 上创建索引
- windows - 如何使用带有选项运行的任务计划程序运行批处理文件,无论是否登录
- python-3.x - 熊猫合并语句没有给我数据框之间的区别?
- c++ - 贪吃蛇游戏 - 食物牌的随机数生成器
- git - VS Code 跟踪更改为错误的 Repo
- javascript - javascript-比较数组中的两个字符串以查看它们是否相等
- node.js - AWS 第一台服务器访问第二台服务器上的文件
- java - 获取 jlabel 中文本的边界
- php - 端口 80 上的连接被拒绝重定向到文件
- html - 具有最大高度和最大宽度的响应式图像