JS取得最小公倍数与最大公约数

这次给大家带来JS取得最小公倍数最大公约数,JS取得最小公倍数与最大公约数的注意事项有哪些,下面就是实战案例,一起来看一下。

方法来自求多个数最小公倍数的一种变换算法(详见附录说明)

最小公倍数的算法由最大公约数转化而来。最大公约数可通过如下步骤求得:

(1) 找到a1,a2,..,an中的最小非零项aj,若有多个最小非零项则任取一个
(2) aj以外的所有其他非0项ak用ak mod aj代替;若没有除aj以外的其他非0项,则转到(4)
(3) 转到(1)
(4) a1,a2,..,an的最大公约数为aj

写了两个版本的注意事项求公倍数和公约数,主要偏重于算法,没有太注意命名,很多就直接写的单字母名称。

0. 简单易懂的循环

function getMin(arr){  var min = Infinity  arr.forEach(function(item){    if( 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_maxpifunction 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('最小公倍数',arr_minMulti)

登录后复制

2. object oriented 注意事项

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

登录后复制

附录:求多个数最小公倍数的一种变换算法原理分析

令[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

而对(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

因此只需证明(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类似于矩阵的初等变换,即

令一个向量的最大公约数为该向量各个分量的最大公约数。对于向量注意事项

注意事项

以上就是JS取得最小公倍数与最大公约数的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2762320.html

(0)
上一篇 2025年3月8日 09:54:46
下一篇 2025年3月8日 09:54:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS操作DOM树遍历方法总结

    这次给大家带来JS操作DOM树遍历方法总结,JS操作DOM树遍历的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了JavaScript实现的DOM树遍历方法。分享给大家供大家参考,具体如下: 二叉 DOM 树的遍历 func…

    编程技术 2025年3月8日
    200
  • JS跨域POST实现步骤详解

    这次给大家带来JS跨域POST实现步骤详解,JS跨域POST实现的注意事项有哪些,下面就是实战案例,一起来看一下。 javascript 跨域是一个很常见的问题,其中 jsonp 是一个最常用的手段,但是 jsonp 只支持 get,不支持…

    编程技术 2025年3月8日
    200
  • HTML文档中嵌入JS方法总结

    这次给大家带来HTML文档中嵌入JS方法总结,HTML文档中嵌入JS的注意事项有哪些,下面就是实战案例,一起来看一下。 在HTML里嵌入JavaScript 在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内嵌,放置在和…

    编程技术 2025年3月8日
    200
  • JS中常出现哪些BUG和错误

    这次给大家带来JS中常出现哪些BUG和错误,解决JS中常出现BUG和错误的注意事项有哪些,下面就是实战案例,一起来看一下。 计算机程序中的缺陷通常称为 bug。 它让程序员觉得很好,将它们想象成小事,只是碰巧进入我们的作品。 实际上,当然,…

    编程技术 2025年3月8日
    200
  • JS中this的指向以及call、apply的作用_基础知识

    本篇文章给大家分享了JS基础内容this指向以及call、apply的相关知识点内容,有兴趣的朋友可以学习参考下。 在具体的实际应用中,this 的指向无法在函数定义时确定,而是在函数执行的时候才确定的,根据执行时的环境大致可以分为以下3种…

    编程技术 2025年3月8日
    200
  • JS同步、异步与延迟加载实现总结

    这次给大家带来JS同步、异步与延迟加载实现总结,JS同步、异步与延迟加载实现的注意事项有哪些,下面就是实战案例,一起来看一下。 一:同步加载 我们平时使用的最多的一种方式。 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只…

    编程技术 2025年3月8日
    200
  • JS生成指定范围随机数和随机序列方法详解

    这次给大家带来JS生成指定范围随机数和随机序列方法详解,JS生成指定范围随机数和随机序列的注意事项有哪些,下面就是实战案例,一起来看一下。 在JavaScript中我们经常使用Math.random()方法生成随机数,但是该方法生成的随机数…

    编程技术 2025年3月8日
    200
  • JS内加载jquery.js方法详解

    这次给大家带来JS内加载jquery.js方法详解,JS内加载jquery.js方法的注意事项有哪些,下面就是实战案例,一起来看一下。 最近有一个需求: 1.在一个html中只能引入一个JS文件 不能有JS代码和其他JS文件的引入; 2.这…

    2025年3月8日
    200
  • js三种调用方式优缺点总结

    这次给大家带来js三种调用方式优缺点总结,使用js三种调用方式的注意事项有哪些,下面就是实战案例,一起来看一下。 本文讲述了js的三种使用方式(行内js、内部js、外部js)的实例代码,感兴趣的小伙伴们可以参考一下,具体如下: 1、行内js…

    编程技术 2025年3月8日
    200
  • 动态引入js四种方法总结

    这次给大家带来动态引入js四种方法总结,动态引入js四种方法的注意事项有哪些,下面就是实战案例,一起来看一下。 index.html 登录后复制 test.js alert(“hello! I am test.js”); var str=”…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论