【问题标题】:Smallest Common Multiple [Javascript Challenge]最小公倍数 [Javascript 挑战]
【发布时间】: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]),则解决方案似乎很好。有什么修正或猜测吗?

【问题讨论】:

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

标签: javascript algorithm


【解决方案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

    【讨论】:

    • 是的,伙计。这完美地工作。我确实花了一些时间来理解你的代码,但现在我明白了,我可以肯定地说我的疑问已经消除了。感谢您的时间。 :)
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2020-09-05
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2021-07-16
    相关资源
    最近更新 更多