数学穿越

时间:2015-02-03 05:09:54

标签: javascript math factorial largenumber

我希望能够解决大概数涉及很多问题的概率。为了节省计算时间,我一直在考虑让计算机像普通数学一样交出术语。例如:

  

(2 * 3 * 7 * 3)/(3 * 2 * 3 * 3)

     

可以简化为7/3

如果我要创建一个Javascript函数并将两个包含乘法数的数组传递给它,我将如何进行此操作?

要明确:

如果我传入[3, 4, 6, 4][4, 7, 3, 2],则会返回两个数组:[4, 6][7, 2]

5 个答案:

答案 0 :(得分:2)

是,或者:

var arr1 = [5,2,3,7,8];
var arr2 = [3,5,2,3];
arr1.sort();
arr2.sort();
var i = 0, j = 0;
while (i < arr1.length && j < arr2.length) {
    if (arr1[i] < arr2[j]) {
        ++i;
    } else if (arr1[i] > arr2[j]) {
        ++j;
    } else {
        arr1.splice(i, 1);
        arr2.splice(j, 1);
    }
}
alert(arr1.toString() + "/" + arr2.toString());

更新:显示分数

function prod(arr) {
    var res = 1, i;
    for (i = 0; i < arr.length; ++i) {
        res *= arr[i];
    }
    return res;
}

alert(prod(arr1) + "/" + prod(arr2));

答案 1 :(得分:2)

另一种方法是使用inArray的一个版本(取自jQuery),然后检查每个元素并根据需要删除元素。我不确定与仅仅进行计算相比这会有多好,但是值得在jsPerf上进行测试。

例如:

removeDuplicates([3, 4, 6, 4], [4, 7, 3, 2]);

function removeDuplicates( array_1, array_2 ) {
    array_1.forEach(function(value, index) {
        var in_array = inArray( value, array_2 );
        if ( in_array !== false ) {
            array_1.splice( index, 1 );
            array_2.splice( in_array, 1 );
        }
    });

    console.log(array_1); // [4, 6]
    console.log(array_2); // [7, 2]
}

// from jQuery
function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return i;
    }
    return false;
}

jsFiddle:http://jsfiddle.net/tj6crcdt/

答案 2 :(得分:2)

如果您不需要取消超出确切数字,请执行以下操作:

var x = [3, 4, 6, 4];
var y = [4, 7, 3, 2];
for(var i in x)
{
  for(var j in y)
  {
    if(x[i]==y[j])
    {
      x.splice(i,1);
      y.splice(j,1);
    }
  }
}
console.log(x);
console.log(y);

但是如果您对进一步取消感兴趣,请选择:

var x = [3, 4, 6, 4];
var y = [4, 7, 3, 2];
for(var i in x)
{
  for(var j in y)
  {
    if(x[i]%y[j] == 0)
    {
      if(x[i]/y[j] > 1)
      {
        x[i] = x[i]/y[j];
      }
      else{
        x.splice(i,1);
      }
      y.splice(j,1);
    }
  }
}

console.log(x);
console.log(y);

答案 3 :(得分:1)

这是一个没有依赖关系的方法。有几个假设可能会咬你。

  • 它根据相等性测试数字。在您的用例(概率)中,这将咬住浮点值。

  • 运行计算可能更好。尽管如此,我们知道选择的JavaScript引擎无论如何都在做更好的优化。

以下是代码和示例用法:

var numerator = [2,3,7,3],
denominator = [3,2,3,3],
numerator2 = [3,4,6,4],
denominator2 = [4,7,3,2];

function simplify(num, den) {
  var value = {
    numerator: num.slice(),
    denominator: den.slice()
  },
  done = false,
  remove = function (a, b) {
    for (var aIdx = 0; aIdx < a.length; aIdx++) {
      for (var bIdx = 0; bIdx < b.length; bIdx++) {
        if (a[aIdx] === b[bIdx]) {
          a.splice(aIdx, 1);
          b.splice(bIdx, 1);
          return;
        }
      }
    }
    done = true;
  };
  while (!done) {
    remove(value.numerator, value.denominator);
  }
  return value;
}

simplify(numerator, denominator);
simplify(numerator2, denominator2);

答案 4 :(得分:0)

经过相当多的研究后,我找到了一种方法。

var arr1 = [5,2,3,7,8];
var arr2 = [3,5,2,3];
var extraVals = _.intersection(arr1,arr2);
var arr1Simp = _.difference(arr1, extraVals);
var arr2Simp = _.difference(arr1, extraVals);

或作为一项功能

var likeTerms = function(num, down){
    var extraVals = _.intersection(num,down);
    var numSimp = _.difference(num, extraVals);
    var downSimp = _.difference(down, extraVals);

    if(numSimp.length==0){
        numSimp.push(1);
    }
    if(downSimp.length==0){
        downSimp.push(1);
    }
    return {
        num: numSimp,
        down: downSimp
    };
};

Demo