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

    题目

    找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。

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

    例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。

    smallestCommons([1, 5]) 应该返回一个数字。
    smallestCommons([1, 5]) 应该返回 60。
    smallestCommons([5, 1]) 应该返回 60。
    smallestCommons([1, 13]) 应该返回 360360。           

    思路

    题目解析:假如区间为[1,5],所求的数值是60,也就是说需要求出来的值是的1,2,3,4,5的公倍数(3x4x5)

    由题目可见,两个数字不一定按数字顺序排序。所以我们先做一点微小的排序工作,让69始终是69而变不成无趣的96

      arr=arr.sort(function(a,b){
        return a-b;
      });

    两个数字最小公倍数的求法:A*B/(AB两数的最大公约数)  

    求出两个数的最小公倍数再套第三个数与前两个数的最小公倍数求最小公倍数。我猜你现在已经看晕了,如果你没晕我晕了。看下面的实例就好了。

    6,9,15三个数值的最小公倍数。先把6,9的最小公倍数通过上面的公式求出来就是36,然后再将36和15的最小公倍数求出来是180(大概是)

    180就是6,9,15这三个数的最小公倍数,如果有第四个第五个...依旧按照上面的写法继续求。

    至于最大公约数怎么求,你以为我会告诉你吗?不会,但伟大的先人会。资料:欧几里得算法

    运用上面的理论,将arr[0]到arr[1]的数值代入算法中即可得出最小公倍数

    1   var num=arr[0];
    2   for(var i= arr[0]+1;i<=arr[1];i++){
    3     num*=i/gcd(num,i);
    4   }
    5 //欧几里得算法 求最大公约数
    6 function gcd(m,n){
    7   if(m%n===0)return n;
    8   return gcd(n,m%n);
    9 }

     

    代码:

     1 function smallestCommons(arr) {
     2   arr=arr.sort(function(a,b){
     3     return a-b;
     4   });
     5   var num=arr[0];
     6   for(var i= arr[0]+1;i<=arr[1];i++){
     7     num*=i/gcd(num,i);
     8   }
     9   return num;
    10 }
    11 function gcd(m,n){
    12   if(m%n===0)return n;
    13   return gcd(n,m%n);
    14 }

     

    对技术保持热情与虔诚,生活将会无比伟大
  • 相关阅读:
    04 UUID
    MD5加密算法(信息摘要算法)、Base64算法
    03 MD5加密、Base64处理
    MVC分层思想、SSM编程架构
    1网络编程基本概念
    Tomcat闪退的解决办法
    win10下的jdk1.8安装
    枚举练习
    1000元买物品分配
    win10解决vc++6.0不兼容问题方法
  • 原文地址:https://www.cnblogs.com/XhhDream/p/5843219.html
Copyright © 2011-2022 走看看