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

原题代码如下:

function smallestCommons(arr) {
  return arr;
}

smallestCommons([1,5]);

  最小公倍数的参考资料:https://www.mathsisfun.com/least-common-multiple.html。

因为参数不一定是从小到大排序的,所以需要先对参数做一个排序:

arr=arr.sort();

  

然后需要了解到的是如何求最小公倍数, 通过查询资料了解到最小公倍数的求法,A,B两个数的最小公倍数公式:A*B/gcd(A,B的最大公约数)。

有了这个算法,只需要要对连续数字头两个进行求最小公倍数,然后再把这个值和下一个数字求最小公倍数,遍历到最大参数即可。

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

  现在我们还缺的是如何求最大公约数, 需要使用的公式是欧几里德定律。

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(i,num);
}
  return num;
}
  function gcd(m,n){
  if(m%n===0)return n;
  return gcd(n,m%n);

}

smallestCommons([1,5]);

  

时间: 2024-10-18 16:04:31

Fcc找出能被给定的两个参数和参数之间所有连续数字整除的最小公倍数。的相关文章

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

存档. 找出能被两个给定参数和它们之间的连续数字整除的最小公倍数. 1 function smallestCommons(arr) { 2 //分解质因数法,分解为若干个质数相乘 3 var arrratio=[]; 4 var l=0; 5 var min=Math.min(arr[0],arr[1]); 6 var max=Math.max(arr[0],arr[1]); 7 for(var i=min+1;i<max;i++){ 8 arr.push(i); 9 } 10 11 /* va

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

function smallestCommons(arr) { arr = arr.sort(); //从小到大排序 var result ; //结果 var judge = false; //判断公倍数 var count = 0; //计数 for(var g=arr[1];g<400000;g++){ //从arr[1]开始遍历判断公倍数g,'j<400000'可为空,直到无穷(不推荐) for(var i=arr[0];i<=arr[1];i++){ //遍历 给定参数arr之

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

今天看到别人的面试算法题,求找出十包粉末中两包蓝色粉末的最短时间

题目:有4个杯子,10包粉末,其中有2包溶于水变蓝,其余无色,粉末溶于水2min才能显现颜色.求找出两包蓝色粉末的最短时间.假设水和粉末用不完. 方法一: 第一趟:[12,34,56,78] 每个杯子分别放两包加水融化,剩下两包不管.可能的情况: (1)0个杯子变色,说明剩下两包就是蓝粉末 (2)1个杯子变色,则蓝粉末在这个杯子两包和未融化的两包其中两包,第二趟四包融化一定可以找到 (3)2个杯子变色,则在这两个杯子的四包粉末中,第二趟可找到. 时间均值:E = 2*1/45 + 4*44/45

找出1-100中缺失的两个数

题目:有一个数组 int array[100]:本来应该存放的数为1~100,但是有两个数据a,b丢失了,值变成了0.问如何找出丢失的那两个数?附带条件不能开辟额外的空间. 解题思路:常见的两种解法有:1.计算a+b和a*b的值,然后在解方程求解(但是这样会使得中间某个变量过大).2.使用bit位来标记.占用13个字节.第二种方法使用了额外空间,第一种可能会造成整型溢出.这里考虑转化为熟悉的方法.数组array[100],其下标正好为0-99,能不能利用上数组下标求解呢?答案是肯定的.这里将数组

找出不小于给定数字的最小2的幂值

2017/3/13 12:59:41 看JDK源码,在HashMap类中发现了一个可以很好解决这个问题的方法. 问题描述: 假设给定 14,输出16:给定16,也输出16:给定17,输出32.输出满足给定数字的最小2的幂值 算法: int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; # 001XXXXX --> 0011XXXX n |= n >>> 2; # 0011XXXX --> 001

剑指offer中在一个有序数组中找出和为s的两个数字

#include<iostream> using namespace std; bool findnumberwithsum(int A[],int length,int *num1,int *num2,int key) { if(NULL==A||length<=0||NULL==num1||NULL==num2) return false; int start=0; int end=length-1; int sum=0; while(start<end) { *num1=A[

九度oj 题目1256:找出两个只出现了一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的第一行包括一个整数N(1<=N<=1000). 接下来的一行包括N个整数. 输出: 可能有多组测试数据,对于每组数据, 找出这个数组中的两个只出现了一次的数字. 输出的数字的顺序为从小到大. 样例输入: 6 2 3 9 3 7 2 样例输出: 7 9 (题目中的条件 N 应该大于1)开始的想法是先排序,然后再去数数,代码如下 1 #include <cstdio>

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]