使用表方法查找最少公倍数

时间:2015-10-19 06:51:17

标签: javascript algorithm

使用Table Method找到所提供参数的最小公倍数,这两个参数可以被两者均分,以及这些参数之间的所有序列号。只有两个参数。对于ex [1,3],找到1,2,3的lcm。

注意 - 它可能会创建一个无限循环

function smallestCommons(arr) {

  var nums = [];
  var multiples = [];
  if(arr[0]>arr[1]) {
    var bigger = arr[0];
  } else {
    var bigger = arr[1];
  }

  for(var i=bigger;i>0;i--) {
    nums.push(i);
    console.log(i);
  }console.log(nums + " nums");

  var sums = 0;

  while(sums != nums.length) {
    for(var k=0;k<nums.length;k++) {
      if(nums[k] % 2 === 0) {
        nums[k] = nums[k]/2;
        multiples.push(2); 
      } else if(nums[k] % 3 === 0) {
        nums[k] = nums[k]/3;
        multiples.push(3); 
      }else if(nums[k] % 5 === 0) {
        nums[k] = nums[k]/5;
        multiples.push(5); 
      }else if(nums[k] % 7 === 0) {
        nums[k] = nums[k]/7;
        multiples.push(7); 
      }else if(nums[k] === 1) {
        break;
      }else {
        nums[k] = nums[k]/nums[k];
        multiples.push(nums[k]);
      }
    }
  for(var j = bigger; j>0;j--) {
     sums = sums + nums[j]; 
   }
  }
 var scm = [multiples].reduce(function(a,b){console.log(a*b)}); return scm
}
smallestCommons([1,5]);

2 个答案:

答案 0 :(得分:1)

您需要的是找到范围内的LCM(n,m)?

Finding least common multiples by prime factorization似乎更好。 您可以使用Legendre's formula查找n的所有素因子!和米! ,然后做一个简单的减法。

答案 1 :(得分:1)

我发现这是一个简单的解决方案,它可以创造奇迹;

  • 循环显示所有可能的数字,从下限输入(var i)开始
  • 对于每个数字,按输入范围(var j)之间的每个数字测试可分性(var j)
  • 如果我符合所有条件,则将其作为答案返回,否则将i递增1并再试一次

click here for explanation of ? operator in variable initialization

function smallestCommons(arr) {


  //set variables for upper and lower bounds 
  //incase they aren't entered in ascending order
  var big = arr[0] < arr[1] ? arr[1]:arr[0],
      small = arr[0] < arr[1] ? arr[0]:arr[1],
      i = small;

  //loop through all numbers, note the possibility of an infinite loop
  while(true){


      //test each number for divisibility by by both upper and lower 
      //bounds, as well as by all sequential numbers inbetween
      for(var j = small; j <= big; j++){

        if(i % j === 0){
          if(j===big){
            return i;
          }
        }else {
          break;
        }
      }   
    i++;
  }
}


smallestCommons([1,5]);  //60