zoukankan      html  css  js  c++  java
  • Smallest Common Multiple FreeCodeCamp

    题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。  范围是两个数字构成的数组,两个数字不一定按数字顺序排序。

    分析:首先题目的意思求一个连续数列的所有数字的最小公倍数,这连续的数字序列可能递增,也可能递减,有两种情况,为了使代码简洁,

       我们将其变为一种情况,也就是递增数列,这样避免重复写递减数列的情况。再一看,这里说了参数是数组,那么可以使用sort()方法排序。

         这道题其实只要懂得怎么求两个数之间的最小公倍数,就可以求这个序列的最小公倍数了。因为,最小公倍数也是一个数字,

       而且无论多长的数列最终都可以化成是求两个数字之间的最小公倍数。比如说你要求的数列1,2,3的最小公倍数是6,1和2的最小公倍数是2,

       求最小公倍数 2  和3的最小公倍数也是6.以此类推即可。

         那么最小公倍数怎么求呢,查看百度百科 最小公倍数 的计算方法

         https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0/6192375?fr=aladdin

     

            如图,可知,最小公倍数等于它们的 最大公约数 和 它们各自与最大公约数的 商 的乘积。

    那么最大公约数这么求呢,查看百度百科最大公约数的求法,

    https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin

    可知,我们可以使用辗转相除法也就是欧几里德算法

    js使用递归实现为:

    function gcd(m,n){
      if(m%n===0)return n;
      return gcd(n,m%n);
    }

          至此,思路已经基本清晰。完整实现代码为:

    function gcd(m, n){
    if(m%n === 0) return n;
    return gcd(n, m%n);
    }

    function smallestCommons(arr) {
    arr = arr.sort();
    var num = arr[0];
    for(var i= arr[0]+1; i<=arr[1]; i++){
    num *= i/gcd(num, i);
    }
    return num;
    }

  • 相关阅读:
    最小割树
    POJ2774 很长的信息
    决战 状压dp
    confd + Nacos | 无代码侵入的配置变更管理
    阿里云应用高可用服务 AHAS 流控降级实现 SQL 自动防护功能
    Web应用托管服务(Web+)隐藏的十个上云最佳姿势
    Java 函数优雅之道
    探索云网络技术前沿,Sigcomm 2019 阿里云参会分享
    MaxCompute 最新特性介绍 | 2019大数据技术公开课第三季
    阿里巴巴大数据产品最新特性介绍 | 2019大数据技术公开课第四季
  • 原文地址:https://www.cnblogs.com/zhrngM/p/8644173.html
Copyright © 2011-2022 走看看