js 求一个数组元素的最小公倍数

今天我在网上查 “js 求一个数组元素的最小公倍数”,不管是Google还是百度,查出来的答案竟然都是一样的,最关键的是这是错误的。

错误在哪那!刚一看感觉是正确的,而且你输入几个不同的数组,输出的是正确的,but,当我输入[2,3,4]的时候竟然是24,这就很明显不对了,还有输入[0,1]的时候输出的是1,

我发现了这两点不对。好了贴一下我自己的代码。

var lcm = function () {

// TODO: Program me

var m=0;

for(var i=0;i<arguments.length;i++)

{

if(arguments[i]==0)

return 0;

m=gcd(m,arguments[i]);

}

return m;

};

function gcd(a,b){

var maxNum=Math.max(a,b),minNum=Math.min(a,b),count;

if(a===0||b===0)

return maxNum;

for(var i=1;i<=maxNum;i++)

{

count=minNum*i;

if(count%maxNum===0)

{

return count;

break;

}

}

}

传入的数组参数是非负的整数。

如果这还不过瘾的话,下面是大牛的代码:

var lcm = function () {

function gcd(a,b) {

if (a == 0) return b;

return gcd(b%a, a);

}

return Array.prototype.slice.apply(arguments).reduce(function(a,b) {return a*b / gcd(a,b);}, 1);

};

是不是超级简洁。

如果觉得还不够的话:

var lcm = function ()

{

var numbers = Array.prototype.slice.call(arguments);

if (!numbers.length)

return null;

if (!Math.min.apply(null, numbers))

return 0;

return numbers.reduce(lcmOf2Numbers, numbers.pop());

};

var lcmOf2Numbers = function (number1, number2)

{

return number1 * number2 / gcdOf2Numbers(number1, number2);

};

var gcdOf2Numbers = function (number1, number2)

{

return !number2 ? number1 : gcdOf2Numbers(number2, number1 % number2);

};

那么是不是还可以这样:

var lcm = function () {

if(!arguments.length) return false;

if(arguments.length == 1) return arguments[0];

var length = arguments.length,

base   = arguments[0];

for( var i=1; i < length; i++ ){

var current = arguments[i],

bbase = base;

while( base && current ){

if( base > current ){

base = base % current;

} else {

current = current % base;

}

}

base = (bbase * arguments[i])/(base+current);

}

return base;

};

时间: 2024-10-12 08:50:58

js 求一个数组元素的最小公倍数的相关文章

巧妙利用快速排序法的原理求一个数组中的第10大元素

//快速排序法 int QuickSort_process3(int *a, int low, int high) { int l, h, temp; l = low; h = high; temp = a[low]; while (l < h){ while (l< h&&a[h] >= temp) --h; if (l < h) a[l] = a[h]; while (l < h&&a[l] < temp) ++l; if (l &l

求一个数组的子数组的最大和

如题:求一个数组的子数组的最大和,要求O(n)时间复杂度. 由于有了O(n)时间复杂度的限制,所以暴力求解的O(n^2)方法肯定不行.再考虑递归求一个数组a[n]的子数组的最大和,可以分解为a[i]子数组的最大和以及a[n-i-1]之间的某种情况 a[n]的子数组最大和等于a[i]子数组的最大和: a[n]的子数组最大和等于a[n-i-1]: a[n]的子数组最大和跨a[i]和a[n-i-1]: 递归实现的时间复杂度为O(nlg(n)).最后考虑时间复杂度为O(n)的动态规划实现. /** *

JS中对数组元素进行增删改移

在js中对数组元素进行增删改移,简单总结了一下方法: 方法 说明 实例 push( ); 在原来数组中的元素最后面添加元素 arr.push("再见58"); unshift( ); 在原来数组中的元素最前面添加元素 arr.shift("你好58"): pop(); 移除数组中最后面的一个元素 arr.pop(); shift(); 移除数组中最前面的一个元素 arr.shift(); concat(); 拼接两个数组中的元素 (哪个数组在前面,拼接后它的元素就在

求一个数组的最大k个数(java)

问题描述:求一个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解法,复杂度是O(logn*n),但是有时候并不需要排序,用简单的选择排序,或者是冒泡排序,那么就K轮的交换或者是选择,就可以得出结论,复杂度是O(n*k),当K很大的时候排序可能是更好的解法,当K小的时候用选择或者是冒泡效率会更加的高.但是这都是会对前K个数进行排序,所以效率不高,当K很大的时候,以

用JS实现一个数组合并的方法(要求去重)

最近发现一道面试题,用JS实现一个数组合并的方法(要求去重).我们知道,concat方法会合并两个数组并返回一个新的数组,新的数组会包含旧数组中的每一个元素,即[1,2,3]与[2,3,4]合并后的结果为[1,2,3,2,3,4].那么该如何实现,既能合并又能去重? 思路就是,将目标数组的值作为key放进一个对象中,在这个过程中,重复的值就被过滤掉了,这样就排除了重复的值. 两个数组,a = [1,2,3], b = [2,3,4],要求合并后的数组为[1,2,3,4] Array.protot

【编程题目】求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}

47.创新工场(算法):求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 思路:动态规划 从最后一个数字开始,计算以当前数字其实的序列的最长递减子序列. 每次找最长子序列,都扫描它之前求得的子序列中最长,且第一个数字比当前数字小的. 如: 第一个数字 2, 最大长度 1, 下一个数字是 第 7 个 第二个数字 3,  最大长度 2, 下一个数字是 第 7 个 第三个数字 4,  最大长度 3, 下一个数字是 第 6 个 第四个数字 5, 

软件工程结对开发之求一个数组中连续最大子数组之和

一.团队成员: 檀威,陈志利 二.项目名: 求一个数组中连续最大子数组之和 三.我们的设计思路: 设sum[i]为以第i个元素结尾且和最大的连续子数组.对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且它们之和最大的连续子数组要么是以第i-1个元素结尾且它们之和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + arr[i], arr[i]).可以通过判断sum[i-1] + arr[i]是否大于arr[i]来做

求一个数组中只出现一次的数字

/* 求一个数组中只出现一次的数字(注:只针对数组中有两个数不同,且其他数字两两相同) 题目:一个整型数组里除了两个数字出现一次外,其他的数字都出现了两次:求出现一次的数字: 如:数组a[]={2,4,3,6,3,2,5,5};执行程序后应输出4和6:因为4,6只在该数组中出现了一次 思路:两个数字相同其异或结果一定为0,先异或->再分组-->再对每个子序列异或 算法: 1. 先对数组的每一个元素进行异或操作,求结果(本质就是对那两个不同的数的异或,即4^6=0010) 2.根据异或的操作结果

求一个数组中最大连续子序列的和

10.求一个数组中最大连续子序列的和 参考链接:http://blog.csdn.net/butwang/article/details/4691974 思路:如果已经知道在前0~k-1共k个元素中,在最大和为MaxAll[k-1], 怎么求0~k共k+1个元素的MaxAll[k]. 如果前k个元素的最大和子序列包括a[k-1],则很容易知道MaxAll[k] = max(MaxAll[k-1] + a[k], a[k]).那如果前k个元素的最大和子序列不包括a[k-1]呢?在数组后面增加一个元