在给定范围内找出n个数的倍数

时间:2015-07-07 12:52:55

标签: javascript algorithm math

如何找到范围1到K的N个数字(作为数组输入)的倍数,其中1

function findNumberOfMultiples(inputArray, maxSize) {   
    var count = 0;
    var tempArray = [];
    for (var i=0; i<maxSize; i++){
        tempArray[i] = 0;
    }

    for (var j=0; j<inputArray.length; j++) {
        for (var i=1; i<=maxSize; i++) {
            if (i % inputArray[j]) {
                tempArray[i-1] = 1;
            }
        }
    }

    for (var i=0; i<maxSize; i++) {
        if (tempArray[i]==1) {
            count++;
        }
    }
 return count;
}

上述程序因大数K而失败。例如,如果inputArray = [2,3,4]maxSize(k)5

  • 2的倍数是2,4
  • 3的倍数是3
  • 4的倍数是4

因此,在1至5的范围内,2或3或4的多个总数为3

2 个答案:

答案 0 :(得分:2)

你可以在O(N ^ 2)中解决这个问题,其中N是数组中元素的数量。

让我们假设你的数组中有两个元素[a1,a2],范围是K

你的答案是=&gt;

  K/a1 + K/a2 - K/lcm(a1,a2) // because you added them in both a1 and a2

所以如果你有a1,.....ax个元素,你的答案就是

K/a1+.....K/ax - K/lcm(ai,aj) (you have to replace i,j by (n*n-1)/2 combinations. 

你必须做K/lcm(ai,aj) O(N ^ 2)次(确切地说是(n * n-1)/ 2次)。因此,算法复杂度将为O(N ^ 2)(将存在Log(min(ai,aj))因子,但这对整体复杂性没有太大影响)。 这将适用于任何K,因为它只取决于您的输入数组大小。

 public int combinations(int K, int[] input){
    int total = 0;
    for(int i=0;i<input.length;i++){
        total  =  total + Math.floor(K/input[i]);
    }
    for(int i=0;i<input.length;i++){
        for(int j=i+1;j<input.length;j++){
            if(i!=j){
                int lcm =lcmFind(input[i], input[j]);
                total = total - Math.floor(K/lcm);
            }
        }
    }
    return total;
}

您提供的测试用例:

enter image description here

答案 1 :(得分:1)

这个功能似乎可以解决问题:

var findMultiplesLength = function(arrayInput, max) {
  var globalMultiples = [];
  for (var j = 0; j < arrayInput.length; j++) {
    var x = arrayInput[j];
    var n = max / x;
    for (var i=1; i < n; i++) {
      mult = i * x;
      if (globalMultiples.indexOf(mult) === -1) {
        globalMultiples.push(mult);
      }
    }
  }
  return globalMultiples.length;
};

编辑:您不会有任何堆栈错误,但为该范围选择大值可能会挂起您的浏览器。