亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript求一組數的最小公倍數和最大公約數常用算法詳解【面向對象,回歸迭代和循環】

2024-05-06 16:44:09
字體:
來源:轉載
供稿:網友

本文實例講述了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)

附錄:求多個數最小公倍數的一種變換算法原理分析

令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍數,(a1,a2,..,an)表示a1,a2,..,an的最大公約數,其中a1,a2,..,an為非負整數。對于兩個數a,b,有[a,b]=ab/(a,b),因此兩個數最小公倍數可以用其最大公約數計算。但對于多個數,并沒有[a1,a2,..,an]=M/(a1,a2,..,an)成立,M為a1,a2,..,an的乘積。例如:[2,3,4]并不等于24/(2,3,4)。即兩個數的最大公約數和最小公倍數之間的關系不能簡單擴展為n個數的情況。

這里對多個數最小公倍數和多個數最大公約數之間的關系進行了探討。將兩個數最大公約數和最小公倍數之間的關系擴展到n個數的情況。在此基礎上,利用求n個數最大公約數的向量變換算法計算多個數的最小公倍數。

1.多個數最小公倍數和多個數最大公約數之間的關系

令p為a1,a2,..,an中一個或多個數的素因子,a1,a2,..,an關于p的次數分別為r1,r2,..,rn,在r1,r2,..,rn中最大值為rc1=rc2=..=rcm=rmax,最小值為rd1=rd2=..=rdt=rmin,即r1,r2,..,rn中有m個數所含p的次數為最大值,有t個數所含p的次數為最小值。例如:4,12,16中關于素因子2的次數分別為2,2,4,有1個數所含2的次數為最大值,有2個數所含2的次數為最小值;關于素因子3的次數分別為0,1,0,有1個數所含3的次數為最大值,有2個數所含3的次數為最小值。

對最大公約數有,只包含a1,a2,..,an中含有的素因子,且每個素因子次數為a1,a2,..,an中該素因子的最低次數,最低次數為0表示不包含[1]。

對最小公倍數有,只包含a1,a2,..,an中含有的素因子,且每個素因子次數為a1,a2,..,an中該素因子的最高次數[1]。

定理1:[a1,a2,..,an]=M/(M/a1,M/a2,..,M/an),其中M為a1,a2,..,an的乘積,a1,a2,..,an為正整數。

例如:對于4,6,8,10,有[4,6,8,10]=120,而M=4*6*8*10=1920,M/(M/a1,M/a2,..,M/an) =1920/(6*8*10,4*8*10,4*6*10,4*6*8)=1920/16=120。

證明:

M/a1,M/a2,..,M/an中p的次數都大于等于r1+r2+..+rn-rmax,且有p的次數等于r1+r2+..+rn-rmax的。這是因為

(1)M/ai中p的次數為r1+r2+..+rn-ri,因而M/a1,M/a2,..,M/an中p的次數最小為r1+r2+..+rn-rmax。

(2)對于a1,a2,..,an中p的次數最大的項aj(1項或多項),M/aj中p的次數為r1+r2+..+rn-rmax。

或者對于a1,a2,..,an中p的次數最大的項aj,M/aj中p的次數小于等于M/ak,其中ak為a1,a2,..,an中除aj外其他的n-1個項之一,而M/aj中p的次數為r1+r2+..+rn-rmax。

因此,(M/a1,M/a2,..,M/an)中p的次數為r1+r2+..+rn-rmax,從而M/(M/a1,M/a2,..,M/an)中p的次數為rmax。

上述的p并沒有做任何限制。由于a1,a2,..,an中包含的所有素因子在M/(M/a1,M/a2,..,M/an)中都為a1,a2,..,an中的最高次數,故有[a1,a2,..,an]=M/(M/a1,M/a2,..,M/an)成立。

得證。

定理1對于2個數的情況為[a,b]=ab/(ab/a,ab/b)=ab/(b,a)=ab/(a,b),即[a,b]=ab/(a,b)。因此,定理1為2個數最小公倍數公式[a,b]=ab/(a,b)的擴展。利用定理1能夠把求多個數的最小公倍數轉化為求多個數的最大公約數。

2.多個數最大公約數的算法實現

根據定理1,求多個數最小公倍數可以轉化為求多個數的最大公約數。求多個數的最大公約數(a1,a2,..,an)的傳統方法是多次求兩個數的最大公約數,即

(1)用輾轉相除法[2]計算a1和a2的最大公約數(a1,a2)

(2)用輾轉相除法計算(a1,a2)和a3的最大公約數,求得(a1,a2,a3)

(3)用輾轉相除法計算(a1,a2,a3)和a4的最大公約數,求得(a1,a2,a3,a4)

(4)依此重復,直到求得(a1,a2,..,an)

上述方法需要n-1次輾轉相除運算。

本文將兩個數的輾轉相除法擴展為n個數的輾轉相除法,即用一次n個數的輾轉相除法計算n個數的最大公約數,基本方法是采用反復用最小數模其它數的方法進行計算,依據是下面的定理2。

定理2:多個非負整數a1,a2,..,an,若aj>ai,i不等于j,則在a1,a2,..,an中用aj-ai替換aj,其最大公約數不變,即 (a1,a2,..,aj-1,aj,aj+1,..an)=(a1,a2,..,aj-1,aj-ai,aj+1,..an)。

例如:(34,24,56,68)=(34,24,56-34,68)=(34,24,22,68)。

證明:

根據最大公約數的交換律和結合率,有

(a1,a2,..,aj-1,aj,aj+1,..an)= ((ai,aj),(a1,a2,..,ai-1,ai+1,..aj-1,aj+1,..an))(i>j情況),或者

(a1,a2,..,aj-1,aj,aj+1,..an)= ((ai,aj),(a1,a2,..,aj-1,aj+1,..ai-1,ai+1,..an))(i<j情況)。

而對(a1,a2,..,aj-1,aj-ai,aj+1,..an),有

(a1,a2,..,aj-1,aj-ai,aj+1,..an)= ((ai, aj-ai),( a1,a2,..,ai-1,ai+1,.. aj-1,aj+1,..an))(i>j情況),或者

(a1,a2,..,aj-1,aj-ai,aj+1,..an)= ((ai, aj-ai),( a1,a2,..,aj-1,aj+1,.. ai-1,ai+1,..an))(i<j情況)。

因此只需證明(ai,aj)=( ai, aj-ai)即可。

由于(aj-ai)= aj-ai,因此ai,aj的任意公因子必然也是(aj-ai)的因子,即也是ai,( aj-ai)的公因子。由于aj = (aj-ai)+ai,因此ai,( aj-ai)的任意公因子必然也是aj的因子,即也是ai,aj的公因子。所以,ai,aj的最大公約數和ai,(aj-ai) 的最大公約數必須相等,即(ai,aj)=(ai,aj-ai)成立。

得證。

定理2類似于矩陣的初等變換,即

令一個向量的最大公約數為該向量各個分量的最大公約數。對于向量<a1,a2,..,an>進行變換:在一個分量中減去另一個分量,新向量和原向量的最大公約數相等。

求多個數的最大公約數采用反復用最小數模其它數的方法,即對其他數用最小數多次去減,直到剩下比最小數更小的余數。令n個正整數為a1,a2,..,an,求多個數最大共約數的算法描述為:

(1)找到a1,a2,..,an中的最小非零項aj,若有多個最小非零項則任取一個

(2)aj以外的所有其他非0項ak用ak mod aj代替;若沒有除aj以外的其他非0項,則轉到(4)

(3)轉到(3)

(4)a1,a2,..,an的最大公約數為aj

例如:對于5個數34, 56, 78, 24, 85,有

(34, 56, 78, 24, 85)=(10,8,6,24,13)=(4,2,6,0,1)=(0,0,0,0,1)=1,

對于6個數12, 24, 30, 32, 36, 42,有

(12, 24, 30, 32, 36, 42)=(12,0,6,8,0,6)=(0,0,0,2,0,6)=(0,0,0,2,0,0)=2。

3. 多個數最小共倍數的算法實現

求多個數最小共倍數的算法為:

(1)計算m=a1*a2*..*an

(2)把a1,a2,..,an中的所有項ai用m/ai代換

(3)找到a1,a2,..,an中的最小非零項aj,若有多個最小非零項則任取一個

(4)aj以外的所有其他非0項ak用ak mod aj代替;若沒有除aj以外的其他非0項,則轉到(6)

(5)轉到(3)

(6)最小公倍數為m/aj

上述算法在VC環境下用高級語言進行了編程實現,通過多組求5個隨機數最小公倍數的實例,與標準方法進行了比較,驗證了其正確性。標準計算方法為:求5個隨機數最小公倍數通過求4次兩個數的最小公倍數獲得,而兩個數的最小公倍數通過求兩個數的最大公約數獲得。

5. 結論

計算多個數的最小公倍數是常見的基本運算。n個數的最小公倍數可以表示成另外n個數的最大公約數,因而可以通過求多個數的最大公約數計算。求多個數最大公約數可采用向量轉換算法一次性求得。

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩禁在线播放| 97精品国产97久久久久久免费| 2019国产精品自在线拍国产不卡| 色噜噜狠狠狠综合曰曰曰| 91亚洲精品在线观看| 欧美成人h版在线观看| 欧美大片免费看| 日韩欧美福利视频| 欧美疯狂做受xxxx高潮| 亚洲欧美国产精品久久久久久久| 日韩电影中文 亚洲精品乱码| 国产精品v日韩精品| 精品国产91久久久久久老师| 成人网在线视频| 日本久久久久久久久| 欧美激情第1页| 一区二区三区四区视频| 亚洲黄色av女优在线观看| 亚洲精品成a人在线观看| 国产一区二中文字幕在线看| 国产99视频精品免视看7| 国产成人综合精品在线| 成人福利在线观看| 亚洲欧美综合区自拍另类| 欧美日韩裸体免费视频| 成人免费在线视频网址| 亚洲精品99久久久久中文字幕| 中文字幕9999| 亚洲免费一在线| 91精品视频免费| 久久精品国产久精国产一老狼| 国产精品吊钟奶在线| 91天堂在线观看| 91高潮精品免费porn| 亚洲精品福利在线观看| 亚洲毛片在线看| 日韩欧美国产免费播放| 久久综合伊人77777| 欧美性视频网站| 中文字幕亚洲图片| 国产综合福利在线| 中文日韩在线观看| 亚洲无限乱码一二三四麻| 亚洲欧美国产日韩天堂区| 97久久久免费福利网址| 4438全国成人免费| 欧美日韩国产色| 欧美巨猛xxxx猛交黑人97人| 亚洲va国产va天堂va久久| 欧美猛交ⅹxxx乱大交视频| 另类图片亚洲另类| 久久亚洲国产精品成人av秋霞| 国产精品美女久久久免费| 国产成人鲁鲁免费视频a| 久久精品国产欧美激情| 欧美极品美女电影一区| 日韩在线视频中文字幕| 国产视频精品久久久| 日韩大陆毛片av| 欧美老女人bb| 国产精品福利片| 色无极亚洲影院| 97国产在线视频| 精品久久香蕉国产线看观看gif| 亚洲欧美日韩视频一区| 91国产一区在线| 欧美大片免费观看在线观看网站推荐| 18久久久久久| 自拍偷拍亚洲欧美| 欧美日韩国产丝袜美女| 久久久女人电视剧免费播放下载| 不卡av电影院| 九九热99久久久国产盗摄| 日韩成人性视频| 韩国视频理论视频久久| 一区二区三区日韩在线| 国产日韩在线一区| 美女视频黄免费的亚洲男人天堂| 国产精品久久久久久亚洲调教| 欧美成人性生活| 欧美日韩国产麻豆| 亚洲美女在线视频| 精品成人69xx.xyz| 中日韩美女免费视频网址在线观看| 国产精品视频男人的天堂| 日韩av在线电影网| 日韩一区二区久久久| 久久免费观看视频| 久久综合色88| 97国产精品免费视频| 日韩中文字幕精品| 国产亚洲精品综合一区91| 日韩精品丝袜在线| 97在线免费观看视频| 亚洲色图综合网| 91网站在线看| 国产在线播放不卡| 欧美黄色成人网| 亚洲精品理论电影| 97在线免费观看视频| 琪琪亚洲精品午夜在线| 秋霞成人午夜鲁丝一区二区三区| 国产精品人成电影在线观看| 欧洲中文字幕国产精品| 中文字幕久热精品视频在线| 欧美华人在线视频| 亚洲高清福利视频| 国产成人精品久久亚洲高清不卡| 清纯唯美亚洲激情| 精品国产依人香蕉在线精品| 亚洲一区二区三区成人在线视频精品| 5566日本婷婷色中文字幕97| 久久夜色精品国产亚洲aⅴ| 日本伊人精品一区二区三区介绍| 欧美久久精品午夜青青大伊人| 欧美精品久久久久a| 黄网动漫久久久| 亚洲人a成www在线影院| 国产精品久久久久久久久久| www.久久撸.com| 伊人一区二区三区久久精品| 91久久久久久久久久久| 成人xvideos免费视频| 日韩美女免费视频| 久久久精品影院| 成人精品久久av网站| 亚洲综合大片69999| 91精品视频免费看| 日韩电影在线观看永久视频免费网站| 一二美女精品欧洲| 日韩欧美在线第一页| 日韩精品一二三四区| 成人性生交大片免费看小说| 国产美女久久精品| 亚洲男人第一网站| 日韩精品在线观看网站| 一级做a爰片久久毛片美女图片| 色综合天天狠天天透天天伊人| 欧美黑人又粗大| 日韩视频―中文字幕| 国产欧美日韩丝袜精品一区| 91精品久久久久久综合乱菊| 激情亚洲一区二区三区四区| 在线观看成人黄色| 亚洲一区二区三区毛片| 亚洲自拍另类欧美丝袜| 久久精品视频亚洲| 亚洲国产精品高清久久久| 国外日韩电影在线观看| 大荫蒂欧美视频另类xxxx| 欧美另类极品videosbestfree| 亚洲三级黄色在线观看| 蜜月aⅴ免费一区二区三区| 欧美视频免费在线| 国产精品久久久亚洲| 成人a在线视频| 亚洲日本中文字幕| 欧美亚洲另类制服自拍| 欧美日韩亚洲视频| 中文字幕亚洲一区二区三区| 国产精品丝袜一区二区三区| 日本免费在线精品| 亚洲第一精品电影| 欧美性69xxxx肥|