📜  js 最接近 100 - Javascript (1)

📅  最后修改于: 2023-12-03 15:17:02.591000             🧑  作者: Mango

JS 最接近 100 - JavaScript

JavaScript 是一种十分流行的编程语言,可以通过各种方式来计算最接近 100 的值。以下是一些实现方法。

方法一:使用 eval 函数

使用 eval 函数可以将一个字符串转化为可执行的代码,并返回它的值。可以使用一个 for 循环来组合不同的数字和操作符,计算结果后与目前最接近 100 的结果进行比较,更新最接近 100 的结果。

let closest = -1;
for (let i=0; i<10000; i++) {
  let str = '';
  for (let j=0; j<9; j++) {
    str += Math.floor(Math.random()*10).toString();
    if (j<8) {
      str += ['+', '-', '*', '/'][Math.floor(Math.random()*4)];
    }
  }
  let result = eval(str);
  if (Math.abs(result-100) < Math.abs(closest-100)) {
    closest = result;
  }
}
console.log(closest); // 输出最接近 100 的值
方法二:使用递归函数

使用递归函数可以将所有可能的组合情况计算出来,并返回最接近 100 的值。可以使用两个变量来分别保存当前计算的结果和最接近 100 的结果,每次计算后比较更新最接近 100 的结果。

function calculate(str, curResult, closest) {
  if (!str.length) {
    if (Math.abs(curResult-100) < Math.abs(closest-100)) {
      closest = curResult;
    }
    return closest;
  }
  let curNum = '';
  for (let i=0; i<str.length; i++) {
    curNum += str[i];
    let restStr = str.slice(0,i) + str.slice(i+1);
    closest = calculate(restStr, curResult+parseInt(curNum), closest);
    closest = calculate(restStr, curResult-parseInt(curNum), closest);
    closest = calculate(restStr, curResult*parseInt(curNum), closest);
    closest = calculate(restStr, curResult/parseInt(curNum), closest);
    if (curNum[0] === '0') break;
  }
  return closest;
}

let closest = calculate('123456789', 0, Infinity);
console.log(closest); // 输出最接近 100 的值
方法三:使用动态规划

使用动态规划可以将所有可能的组合情况计算出来,并返回最接近 100 的值。可以使用一个二维数组来保存计算结果,并按照加减乘除的顺序进行计算。

function calculate(str) {
  const n = str.length;
  const dp = new Array(n).fill(null).map(() => new Array(n).fill(0));
  for (let i=0; i<n; i++) {
    dp[i][i] = parseInt(str[i]);
  }
  for (let len=2; len<=n; len++) {
    for (let i=0; i<=n-len; i++) {
      const j = i+len-1;
      for (let k=i; k<j; k++) {
        const left = dp[i][k];
        const right = dp[k+1][j];
        dp[i][j] = Math.max(dp[i][j], left+right, left-right, left*right);
        if (right) dp[i][j] = Math.max(dp[i][j], left/right);
      }
    }
  }
  return dp[0][n-1];
}

let closest = null;
for (let i=0; i<9; i++) {
  for (let j=i+1; j<9; j++) {
    const str1 = '123456789'.slice(0,i) + '+' + '123456789'.slice(i,j) + '+' + '123456789'.slice(j);
    const result1 = calculate(str1);
    if (!closest || Math.abs(result1-100) < Math.abs(closest-100)) {
      closest = result1;
    }
    const str2 = '123456789'.slice(0,i) + '-' + '123456789'.slice(i,j) + '-' + '123456789'.slice(j);
    const result2 = calculate(str2);
    if (Math.abs(result2-100) < Math.abs(closest-100)) {
      closest = result2;
    }
    const str3 = '123456789'.slice(0,i) + '*' + '123456789'.slice(i,j) + '*' + '123456789'.slice(j);
    const result3 = calculate(str3);
    if (Math.abs(result3-100) < Math.abs(closest-100)) {
      closest = result3;
    }
    if ('123456789'.slice(j).indexOf('0') === -1) {
      const str4 = '123456789'.slice(0,i) + '/' + '123456789'.slice(i,j) + '/' + '123456789'.slice(j);
      const result4 = calculate(str4);
      if (Math.abs(result4-100) < Math.abs(closest-100)) {
        closest = result4;
      }
    }
  }
}
console.log(closest); // 输出最接近 100 的值

以上是三种方法来计算最接近 100 的值,每种方法都有其优缺点,适用于不同的场景。但是注意,这些方法仅为娱乐之用,实际应用请慎重。