本文實(shí)例講述了JavaScript求一組數(shù)的最小公倍數(shù)和最大公約數(shù)常用算法。分享給大家供大家參考,具體如下:
方法來(lái)自求多個(gè)數(shù)最小公倍數(shù)的一種變換算法(詳見(jiàn)附錄說(shuō)明)
最小公倍數(shù)的算法由最大公約數(shù)轉(zhuǎn)化而來(lái)。最大公約數(shù)可通過(guò)如下步驟求得:
(1) 找到a1,a2,..,an中的最小非零項(xiàng)aj,若有多個(gè)最小非零項(xiàng)則任取一個(gè)
(2) aj以外的所有其他非0項(xiàng)ak用ak mod aj代替;若沒(méi)有除aj以外的其他非0項(xiàng),則轉(zhuǎn)到(4)
(3) 轉(zhuǎn)到(1)
(4) a1,a2,..,an的最大公約數(shù)為aj
寫(xiě)了兩個(gè)版本的javascript求公倍數(shù)和公約數(shù),主要偏重于算法,沒(méi)有太注意命名,很多就直接寫(xiě)的單字母名稱。
0. 簡(jiǎn)單易懂的循環(huán)
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('最小公倍數(shù)',arr_minMulti)2. object oriented 面向?qū)ο?/p>
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)
新聞熱點(diǎn)
疑難解答
圖片精選