首页 > 语言 > JavaScript > 正文

JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向

2024-05-06 15:34:33
字体:
来源:转载
供稿:网友

本文实例讲述了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)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选