最小公倍数:中级 Javascript 算法

Posted

技术标签:

【中文标题】最小公倍数:中级 Javascript 算法【英文标题】:Smallest Common Multiple: Intermediate Javascript Algorithm 【发布时间】:2020-09-05 16:48:16 【问题描述】:

问题

找到所提供参数的最小公倍数,该公倍数可以被两者以及这些参数之间范围内的所有序号均分。

范围将是一个由两个数字组成的数组,不一定按数字顺序。

例如,如果给定 1 和 3,请找出 1 和 3 的最小公倍数,它也能被 1 和 3 之间的所有数字整除。这里的答案是 6。

到目前为止我的代码

function smallestCommons(arr) 
  
  let newArr = [];
  
  let changedArr = arr.sort((a, b)=>
   
    if(a>b)
      return 1;
    
   
    if(b>a)
      return -1;
     else 
      return 0;
    
  )

  for(let i = changedArr[0]; i < changedArr[1]; i++)
    newArr.push(i);
  

let answer = changedArr.every((item)=>
  
)




smallestCommons([1,5]);

我的问题

    我希望您能够帮助我理解这个问题 - 我已经研究了最小公倍数,但“可整除”让我很反感。 我希望您能解决问题,并简单地分解解决方案。

我问了很多,所以如果你回答,非常感谢!

【问题讨论】:

请注意,lcm 操作是可交换的和关联的。然后例如你有 lcm(a, b, c) = lcm (lcm(a, b), c) = lcm (a, lcm (b, c))。如果您能够计算两个操作数的 lcm,那么您可以对任意数量的操作数进行迭代。 【参考方案1】:

// since the number is evenly divided by all numbers from min to max
// it is the least common multiple of all numbers in the array [min, min + 1, min + 2, ... max]
const smallestCommonMultiple = (a, b) => 
	const [min, max] = [Math.min(a, b), Math.max(a, b)];
	// create the array from min to max
	const range = [...Array(max - min + 1)].map((_, k) => min + k);
	// greatest common divisor of two numbers
	const gcd = (a, b) => b ? gcd(b, a % b) : Math.abs(a);
	// least common multiple of two numbers
	const lcm = (a, b) => a * b / gcd(a, b);
	// least common multiple of an array of numbers
	const lcma = array => array.reduce(lcm);
	return lcma(range);

console.log(smallestCommonMultiple(1, 3));
console.log(smallestCommonMultiple(2, 4));
console.log(smallestCommonMultiple(3, 5));

【讨论】:

以上是关于最小公倍数:中级 Javascript 算法的主要内容,如果未能解决你的问题,请参考以下文章

FCC上的javascript算法题之中级篇

算法---最小公倍数和最大公约数

算法---最小公倍数和最大公约数

JSK-391 公约公倍入门

FCC 中级算法题 对所有的数字求和

java基礎最大公約數最小公倍數