最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 19:43:26
文檔

如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)

如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù):這次給大家?guī)?lái)如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù),使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。方法來(lái)自求多個(gè)數(shù)最小公倍數(shù)的一種變換算法(詳見附錄說(shuō)明)最小公倍數(shù)的算法由最大公約數(shù)轉(zhuǎn)化而來(lái)。最
推薦度:
導(dǎo)讀如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù):這次給大家?guī)?lái)如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù),使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。方法來(lái)自求多個(gè)數(shù)最小公倍數(shù)的一種變換算法(詳見附錄說(shuō)明)最小公倍數(shù)的算法由最大公約數(shù)轉(zhuǎn)化而來(lái)。最

這次給大家?guī)?lái)如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù),使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。

方法來(lái)自求多個(gè)數(shù)最小公倍數(shù)的一種變換算法(詳見附錄說(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

寫了兩個(gè)版本的javascript求公倍數(shù)和公約數(shù),主要偏重于算法,沒(méi)有太注意命名,很多就直接寫的單字母名稱。

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 maxpi(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_maxpi = maxpi(brr)
 return totalMulti/brr_maxpi
}

1. function套function

var arr_minMulti, arr_maxpi
function minMulti(arr){
 var totalmulti =
 arr.reduce((multi,curvalue) => multi * curvalue)
 if (totalmulti === 0) {
 arr_minMulti = 0
 return
 }
 var marr = arr.map((item) => totalmulti/item)
 maxpisor(marr)
 arr_minMulti = totalmulti / arr_maxpi
}
function maxpisor(arr){
 var min = getMin(arr)
 if(min === Infinity) {
 arr_maxpi = min
 return
 }
 var exparr = arr.filter(function(item){
 return (item !== min && item !== 0)
 })
 if(exparr.length === 0){
 arr_maxpi = min
 return;
 }
 else{
 var modearr = arr.map(function(item){
 return (item === min||item===0)? item:item%min
 })
 console.log(modearr,'modearr')
 maxpisor(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 maxpisor(arr,origin){
 this.arr = arr
 this.min = this._getMin(arr)
 this.maxpisor = this._getMaxp()
 if(origin){
 this.minMulti = this._getMinMulti()
 }
}
maxpisor.prototype._getMin = function(arr) {
 var min = Infinity
 arr.forEach(item => min = (item && item < min)? item : min)
 return min
}
maxpisor.prototype._getMaxp = function() {
 var arr_maxpi
 var self = this,
 arr = this.arr
 function maxpisor(arr){
 //console.log(self._getMin)
 var min = self._getMin.call(null,arr)
 console.log(min,'min')
 if(min === Infinity) {
 arr_maxpi = 0
 return ;
 }
 var exparr = arr.filter( item => (item !== min && item != 0) )
 if(exparr.length === 0){
 arr_maxpi = min
 return;
 }
 else{
 var modearr = arr.map(item =>
 (item === min || item === 0)? item : item % min
 )
 maxpisor(modearr)
 }
 }
 maxpisor(this.arr)
 return arr_maxpi
}
maxpisor.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 maxpisor(marr,false)
 arr_minMulti = totalmulti / b.maxpisor
 return arr_minMulti
 }
}
var a = new maxpisor([12,9,6],true)
console.log(a)

附錄:求多個(gè)數(shù)最小公倍數(shù)的一種變換算法原理分析

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

這里對(duì)多個(gè)數(shù)最小公倍數(shù)和多個(gè)數(shù)最大公約數(shù)之間的關(guān)系進(jìn)行了探討。將兩個(gè)數(shù)最大公約數(shù)和最小公倍數(shù)之間的關(guān)系擴(kuò)展到n個(gè)數(shù)的情況。在此基礎(chǔ)上,利用求n個(gè)數(shù)最大公約數(shù)的向量變換算法計(jì)算多個(gè)數(shù)的最小公倍數(shù)。

1.多個(gè)數(shù)最小公倍數(shù)和多個(gè)數(shù)最大公約數(shù)之間的關(guān)系

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

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

對(duì)最小公倍數(shù)有,只包含a1,a2,..,an中含有的素因子,且每個(gè)素因子次數(shù)為a1,a2,..,an中該素因子的最高次數(shù)[1]。

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

例如:對(duì)于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的次數(shù)都大于等于r1+r2+..+rn-rmax,且有p的次數(shù)等于r1+r2+..+rn-rmax的。這是因?yàn)?/p>

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

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

或者對(duì)于a1,a2,..,an中p的次數(shù)最大的項(xiàng)aj,M/aj中p的次數(shù)小于等于M/ak,其中ak為a1,a2,..,an中除aj外其他的n-1個(gè)項(xiàng)之一,而M/aj中p的次數(shù)為r1+r2+..+rn-rmax。

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

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

得證。

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

2.多個(gè)數(shù)最大公約數(shù)的算法實(shí)現(xiàn)

根據(jù)定理1,求多個(gè)數(shù)最小公倍數(shù)可以轉(zhuǎn)化為求多個(gè)數(shù)的最大公約數(shù)。求多個(gè)數(shù)的最大公約數(shù)(a1,a2,..,an)的傳統(tǒng)方法是多次求兩個(gè)數(shù)的最大公約數(shù),即

(1)用輾轉(zhuǎn)相除法[2]計(jì)算a1和a2的最大公約數(shù)(a1,a2)

(2)用輾轉(zhuǎn)相除法計(jì)算(a1,a2)和a3的最大公約數(shù),求得(a1,a2,a3)

(3)用輾轉(zhuǎn)相除法計(jì)算(a1,a2,a3)和a4的最大公約數(shù),求得(a1,a2,a3,a4)

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

上述方法需要n-1次輾轉(zhuǎn)相除運(yùn)算。

本文將兩個(gè)數(shù)的輾轉(zhuǎn)相除法擴(kuò)展為n個(gè)數(shù)的輾轉(zhuǎn)相除法,即用一次n個(gè)數(shù)的輾轉(zhuǎn)相除法計(jì)算n個(gè)數(shù)的最大公約數(shù),基本方法是采用反復(fù)用最小數(shù)模其它數(shù)的方法進(jìn)行計(jì)算,依據(jù)是下面的定理2。

定理2:多個(gè)非負(fù)整數(shù)a1,a2,..,an,若aj>ai,i不等于j,則在a1,a2,..,an中用aj-ai替換aj,其最大公約數(shù)不變,即 (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)。

證明:

根據(jù)最大公約數(shù)的交換律和結(jié)合率,有

(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情況)。

而對(duì)(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的最大公約數(shù)和ai,(aj-ai) 的最大公約數(shù)必須相等,即(ai,aj)=(ai,aj-ai)成立。

得證。

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

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

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

(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)到(3)

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

例如:對(duì)于5個(gè)數(shù)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,

對(duì)于6個(gè)數(shù)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. 多個(gè)數(shù)最小共倍數(shù)的算法實(shí)現(xiàn)

求多個(gè)數(shù)最小共倍數(shù)的算法為:

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

(2)把a(bǔ)1,a2,..,an中的所有項(xiàng)ai用m/ai代換

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

(4)aj以外的所有其他非0項(xiàng)ak用ak mod aj代替;若沒(méi)有除aj以外的其他非0項(xiàng),則轉(zhuǎn)到(6)

(5)轉(zhuǎn)到(3)

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

上述算法在VC環(huán)境下用高級(jí)語(yǔ)言進(jìn)行了編程實(shí)現(xiàn),通過(guò)多組求5個(gè)隨機(jī)數(shù)最小公倍數(shù)的實(shí)例,與標(biāo)準(zhǔn)方法進(jìn)行了比較,驗(yàn)證了其正確性。標(biāo)準(zhǔn)計(jì)算方法為:求5個(gè)隨機(jī)數(shù)最小公倍數(shù)通過(guò)求4次兩個(gè)數(shù)的最小公倍數(shù)獲得,而兩個(gè)數(shù)的最小公倍數(shù)通過(guò)求兩個(gè)數(shù)的最大公約數(shù)獲得。

5. 結(jié)論

計(jì)算多個(gè)數(shù)的最小公倍數(shù)是常見的基本運(yùn)算。n個(gè)數(shù)的最小公倍數(shù)可以表示成另外n個(gè)數(shù)的最大公約數(shù),因而可以通過(guò)求多個(gè)數(shù)的最大公約數(shù)計(jì)算。求多個(gè)數(shù)最大公約數(shù)可采用向量轉(zhuǎn)換算法一次性求得。

相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注Gxl網(wǎng)其它相關(guān)文章!

推薦閱讀:

怎樣操作Angular實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求

如何操作node使用async 控制并發(fā)

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)

如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù):這次給大家?guī)?lái)如何使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù),使用JS求得數(shù)組的最小公倍數(shù)和最大公約數(shù)注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。方法來(lái)自求多個(gè)數(shù)最小公倍數(shù)的一種變換算法(詳見附錄說(shuō)明)最小公倍數(shù)的算法由最大公約數(shù)轉(zhuǎn)化而來(lái)。最
推薦度:
標(biāo)簽: 如何 js 用JS
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top