产品,总和和数字的数字

时间:2018-03-25 04:17:32

标签: javascript algorithm math

我的目标是创建一个程序,找到:

  • 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的所有数字的总和。

我试图完成前两个部分,如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))

2 个答案:

答案 0 :(得分:1)

如果是蛮力"方法是可行的,我首先将P(n)定义为函数(下面的se 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();
}
&#13;
<input type="text" id="tpn-input"><button onClick="answer3()">P(n)</button>
<p id = "tpn"></p>
&#13;
&#13;
&#13;

使用字符串.split().filter()以及.reduce()还有其他一些更具可读性的方法,但上述内容肯定会更具性能。

而且,仅仅是为了它,它是一个过度简短的实现:

&#13;
&#13;
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);
}
&#13;
<input type="text" id="tpn-input"><button onClick="answer3()">P(n)</button>
<p id = "tpn"></p>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您应该首先尝试使用某些数组方法迭代从1n的数组。 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)适用于有问题的问题。