本文实例讲述了JavaScript求一组数的最小公倍数和最大公约数常用算法。分享给大家供大家参考,具体如下:
方法来自求多个数最小公倍数的一种变换算法(详见附录说明)
最小公倍数的算法由最大公约数转化而来。最大公约数可通过如下步骤求得:
(1) 找到a1,a2,..,an中的最小非零项aj,若有多个最小非零项则任取一个
(2) aj以外的所有其他非0项ak用ak mod aj代替;若没有除aj以外的其他非0项,则转到(4)
(3) 转到(1)
(4) a1,a2,..,an的最大公约数为aj
写了两个版本的javascript求公倍数和公约数,主要偏重于算法,没有太注意命名,很多就直接写的单字母名称。
0. 简单易懂的循环
function getMin(arr){ var min = Infinity arr.forEach(function(item){ if( item < min && item !=0 ){ min = item } }) return min}function howMuchZero(arr){ var zerocount = 0 arr.forEach( function(item){ item === 0 ? zerocount++ : zerocount } ) if(zerocount === arr.length -1) { return true } else return false}function maxDivi(arr){ do { var min = getMin(arr) arr = arr.map((item)=> item===min? item:item%min ) } while (!howMuchZero(arr)) return getMin(arr)}function minMulti(arr){ var totalMulti = arr.reduce((pre,item)=> pre = pre * item ) var brr = arr.map((item)=> totalMulti/item ) var brr_maxDivi = maxDivi(brr) return totalMulti/brr_maxDivi}
1. function套function
var arr_minMulti, arr_maxdivifunction minMulti(arr){ var totalmulti = arr.reduce((multi,curvalue) => multi * curvalue) if (totalmulti === 0) { arr_minMulti = 0 return } var marr = arr.map((item) => totalmulti/item) maxDivisor(marr) arr_minMulti = totalmulti / arr_maxdivi}function maxDivisor(arr){ var min = getMin(arr) if(min === Infinity) { arr_maxdivi = min return } var exparr = arr.filter(function(item){ return (item !== min && item !== 0) }) if(exparr.length === 0){ arr_maxdivi = min return; } else{ var modearr = arr.map(function(item){ return (item === min||item===0)? item:item%min }) console.log(modearr,'modearr') maxDivisor(modearr) }}function getMin(arr){ var min = Infinity arr.forEach(function(item){ if (item && item < min) { min = item } }) return min}arr =[13,20,10,26]minMulti(arr)console.log('最小公倍数',arr_minMulti)
2. object oriented 面向对象
function maxDivisor(arr,origin){ this.arr = arr this.min = this._getMin(arr) this.maxDivisor = this._getMaxDiv() if(origin){ this.minMulti = this._getMinMulti() }}maxDivisor.prototype._getMin = function(arr) { var min = Infinity arr.forEach(item => min = (item && item < min)? item : min) return min}maxDivisor.prototype._getMaxDiv = function() { var arr_maxdivi var self = this, arr = this.arr function maxDivisor(arr){ //console.log(self._getMin) var min = self._getMin.call(null,arr) console.log(min,'min') if(min === Infinity) { arr_maxdivi = 0 return ; } var exparr = arr.filter( item => (item !== min && item != 0) ) if(exparr.length === 0){ arr_maxdivi = min return; } else{ var modearr = arr.map(item => (item === min || item === 0)? item : item % min ) maxDivisor(modearr) } } maxDivisor(this.arr) return arr_maxdivi}maxDivisor.prototype._getMinMulti = function(){ var arr = this.arr, arr_minMulti var totalmulti = arr.reduce((multi,curvalue) => multi * curvalue) if (totalmulti === 0) { return 0 } else { var marr = arr.map((item) => totalmulti/item), b = new maxDivisor(marr,false) arr_minMulti = totalmulti / b.maxDivisor return arr_minMulti }}var a = new maxDivisor([12,9,6],true)console.log(a)
新闻热点
疑难解答
图片精选