【问题标题】:Product, Sum, and Digits of a Number数字的乘积、总和和位数
【发布时间】:2018-03-25 04:17:32
【问题描述】:

我的目标是创建一个程序来发现:

  • T(P(n)):直到n的所有数字的数字的乘积之和。例如,T(p(5))= p(1)+p(2)+p(3)+p(4)+p(5),其中 p 是计算所有非零数字乘积的函数一个整数。
  • T(S(n)):直到 n 的所有整数的总和,使用 n*(n+1)/2 公式非常简单
  • T(D(n)):直到 n 的所有整数的所有数字的总和。

我已尝试完成前 2 部分,如 codepen 链接所示:https://codepen.io/anon/pen/LdjveQ。 Javascript如下所示:

function result() {
var take = document.getElementById("number").value;
  return eval(take.replace(/(\d)(?=\d)/g, '$1+'));
}
function answer() {
document.getElementById('resultfinal').innerHTML = result();
}

function result2() {
var sake = document.getElementById("integers").value;
  var mult = (sake*(sake+1));
  return eval(mult/2);
}

function answer2() {
document.getElementById('sumofn').innerHTML = result2();
}

我不知道:

  • T(P(n)):如何处理将所有大于 0 但小于 n 的整数的 p(n) 相加的方面。
  • T(D(n)):为什么 n(n+1)/2 公式会产生错误的结果
  • T(S(n)):我应该如何处理 T(D(n))

【问题讨论】:

  • 尝试不使用eval,使用eval 是非常糟糕的做法。

标签: javascript algorithm math


【解决方案1】:

如果“蛮力”方法可行,我将首先将P(n) 定义为一个函数(参见下面的p 函数)并使用for 进行总结:

function p(inputN) {
  var n = inputN, m = 1, digit;
  while (n) {
    digit = n % 10;
    if (digit) m *= digit;
    n = Math.floor(n / 10);
  }
  return m;
}
function result3() {
  var sum = 0, i, n = document.getElementById("tpn-input").value;
  for(var i = 1; i <= n; i++) {
    sum += p(i);
  }
  return sum;
}
function answer3() {
  document.getElementById('tpn').innerHTML = result3();
}
<input type="text" id="tpn-input"><button onClick="answer3()">P(n)</button>
<p id = "tpn"></p>

还有其他一些更易读的方法,使用字符串.split()、.filter() 和.reduce(),但上面的方法肯定会更好。


而且,只是为了它,一个over-oneliner的简短实现:

function p(n) {
  return n.toString().split('').map(Number).filter(i => i).reduce((a, b) => a * b, 1);
}
function tp(n) {
  return [...Array(+n).keys()].map(i => p(i+1)).reduce((a, b) => a + b, 0);
}
function answer3() {
  document.getElementById('tpn').innerHTML =
      tp(document.getElementById("tpn-input").value);
}
<input type="text" id="tpn-input"><button onClick="answer3()">P(n)</button>
<p id = "tpn"></p>

【讨论】:

    【解决方案2】:

    您应该首先尝试使用一些数组方法来迭代从1 到n 的数组。 reduce 最适合这种情况:它接收一个数组,并从对数组中每个元素执行的操作(或少数)返回一些累积值。例如:

    function sumUpToN(n) {
      return Array.from({ length: n + 1}, (_, i) => i)
        .reduce((partialSum, thisNum) => partialSum + thisNum);
    }
    console.log(sumUpToN(5));

    像这样使用 Array.from 生成数组,然后使用 .reduce 迭代它们。第一个参数是.reduce 上一次迭代的返回值,第二个参数是数组中的当前元素。当您需要遍历整个数组并在另一端得到一个值时,请尝试使用类似的方法 - 除了不是简单的加法(这将产生数组中所有元素的总和),请使用任何运算符( s) 适用于所讨论的问题。

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多