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 }

 

 

posted on 2016-09-05 18:17  XhhDream 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/XhhDream/p/5843219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值