最小公倍数 [Javascript 挑战]

Posted

技术标签:

【中文标题】最小公倍数 [Javascript 挑战]【英文标题】:Smallest Common Multiple [Javascript Challenge] 【发布时间】:2020-10-12 19:49:12 【问题描述】:

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

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

例如,如果给定 1 和 3,求 1 和 3 的最小公倍数,它也能被 1 和 3 之间的所有数整除,即能被 1、2 和 3 整除。这里的答案是 6 .

function smallestCommons(arr) 
  var max=Math.max(...arr);
  var min=Math.min(...arr);
  var flag = 0;
  var i = min;
    while(true)
    for(var j=min;j<=max;j++)
        if(i%j!=0)
          flag=1;
          break;
        
      if(flag==0)
        flag=5;
        break;
        
      i++;
    
console.log(i);


smallestCommons([1,5]);

由于某种原因,我的解决方案似乎变得疯狂并进入无限循环。尽管如果我将 var i 初始化为 60(这是此特定情况下所需的输出,即 [1,5]),则解决方案似乎很好。有什么修正或猜测吗?

【问题讨论】:

使用调试器 是的,我试过调试。但这一切似乎都不起作用。我对这一切都比较陌生。因此我很难调试。 *** 会知道的。 ._. 当您将标志设置为不同于 0 的值时,您的循环将变为无限。只有在 flag = 0 时才停止 while 循环。 @AdilAhmed 调试是编程中的一项关键技能。这是你现在应该花一些时间学习的东西 不错!很高兴您确实找到了解决方案。 【参考方案1】:

感谢主要 cmets 部分中的两个编程极客,我确实找到了解决方案。

function smallestCommons(arr) 
  var max=Math.max(...arr);
  var min=Math.min(...arr);
  var flag = 0;
  var count = 0;
  var i = 1;
    while(1)
      for(var j=min;j<=max;j++)
      if(i%j!=0)
        flag=1;
        break;
      if(j==max)
        flag=0;
      
      
      if(flag==0)
        break;
      
      i++;
 
console.log(i);



smallestCommons([10,2]);

【讨论】:

【参考方案2】:

@Kevin 很好地解释了为什么它不起作用。仅当 flag0 时,您的循环才会停止。但是一旦它被设置为1,你就永远不会将它重置为0

function smallestCommons(arr) 
  var max = Math.max(...arr);
  var min = Math.min(...arr);
  var flag = 0;
  var i = min;
  while (true) 
    for (var j = min; j <= max; j++) 
      if (i % j != 0) 
        flag = 1;
        break;
      
    
    if (flag == 0) 
      return i; // Return that common value
    
    flag = 0; // Reset the flag
    i++;
  


console.log(smallestCommons([1, 5]));

这是另一种方法:

function smallestCommons(arr) 
  const min = Math.min(...arr),
        max = Math.max(...arr),
        range = createRange(min, max);
        
  let current = max;

  while (true) 
    const isFullyDivisible = range.every(n => current % n === 0);
    if (isFullyDivisible) 
      return current;
    
    current++;
  


function createRange(min, max) 
  return new Array(max - min + 1).fill(null).map((_, i) => min + i);


console.log(smallestCommons([1, 3]));  // 6
console.log(smallestCommons([5, 1]));  // 60
console.log(smallestCommons([1, 10])); // 2520

【讨论】:

是的,伙计。这完美地工作。我确实花了一些时间来理解你的代码,但现在我明白了,我可以肯定地说我的疑问已经消除了。感谢您的时间。 :)

以上是关于最小公倍数 [Javascript 挑战]的主要内容,如果未能解决你的问题,请参考以下文章

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

题目1438:最小公倍数(利用最大公倍数求解)

求最小公倍数

最小公倍数:中级 Javascript 算法

蓝桥杯练习系统—算法训练 最小最大公倍数

最大公倍数