js算法之旅:枚举

枚举

什么是枚举

将所有可能出现的情况都列举出来就是枚举

例子

口 3x6528=3 口 x8256,在两个口内填入相同的数字使得等式成立。

三行代码枚举解决

for (let i = 0; i < 10; i++) {
  if ((i * 10 + 3) * 6528 == (30 + i) * 8256) {
    console.log(i);
  }
}

练习

现在有 n 根火柴棍,希望拼出形如 A+B=C 的等式。等式中的 A、B、C 均是用火柴棍拼出来的整数(若该数非零,则最高位不能是 0)。数字 0~9 的拼法如下图所示:0123456789
例如现在手上有 14 根火柴棍,则可以拼出两个不同的等式 0+1=1 和 1+0=1。
再例如小哼手上有 18 根火柴棍,则可以拼出 9 个不同的等式,分别为 0+4=4、0+11=111+10=11、2+2=4、2+7=9、4+0=4、7+2=9、10+1=11 和 11+0=11

如何输入一个数,计算出有多少种等式形式?

/**
 *
 * @param {number} num 需要计算的数
 * @return {number} 需要的火柴数
 */
function fn(num) {
  const arr = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6];
  let num1 = 0;
  let num2 = 0;
  if (num > 100) return 999;
  if (num >= 10) {
    num1 = arr[~~(num / 10)];
  }
  num2 = arr[num % 10];
  return num1 + num2;
}

function main(num) {
  for (let i = 0; i < 100; i++) {
    if (fn(i) >= num) continue;
    for (let j = 0; j < 100; j++) {
      if (fn(j) >= num) continue;
      if (fn(i) + fn(j) + fn(i + j) + 4 == num) {
        console.log(`${i}+${j}=${i + j}`);
      }
    }
  }
}
main(18);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易风有点疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值