标签:答案 alert common dex .com i++ question 区别 ons
百度百科上介绍的最大公约数的求法(限两个数)主要有两种:辗转相除法和更相减损法。
辗转相除法,百度百科上的示例:
用(a,b)表示a和b的最大公约数。
1 function gcm(m,n) { 2 var a, c, e, f; 3 //对m,n排序,较小的在前,较大的在后 4 if(m > n) { 5 a = m; 6 m = n; 7 n = a; 8 } 9 c = m, e = n, f = c; 10 while(c !== 0) { 11 f = e % c; 12 e = c; 13 c = f; 14 } 15 alert(e); 16 return e; 17 }
代码中主要是while循环那里有点绕。(参考知乎上的答案)
百度百科上的解释:
1 function gcm2(m,n) { 2 var a, c, e, f, index = 0; 3 //对m,n排序,较小的在前,较大的在后 4 if(m > n) { 5 a = m; 6 m = n; 7 n = a; 8 } 9 //如果m,n都为偶数 10 while(m % 2 === 0 && n % 2 === 0) { 11 m = m/2; 12 n = n/2; 13 index++; 14 } 15 16 f = m, e = n, c = n - m; 17 while(c !== f) { 18 e = f; 19 f = c; 20 c = e - f; 21 if(c < 0) { 22 c = -c; 23 } 24 } 25 alert(f*2*index); 26 return f*2*index; 27 }
计算上辗转相除法以除法为主,更相减损法以减法为主。计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。
要求多个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
两个数的最小公倍数等于这两个数的乘积除以这两个数的最大公约数。
求多个数的最小公倍数时,可以先求出其中两个数的最小公倍数,再求这两个数的最小公倍数与第三个数的最小公倍数,以此类推,直到最后一个数为止。最后得到的最小公倍数就是这几个数的最小公倍数。
下面是代码:
1 function smallestCommons(arr) { 2 arr = arr.sort(function(a,b) { 3 return a-b; 4 }); 5 var brr = []; 6 for (var i = arr[0]; i <= arr[1]; i++) { 7 brr.push(i); 8 } 9 var m,n,c,e,f; 10 11 for (var i = 0; i < brr.length; i++) { 12 13 if(brr[i] <= brr[i+1]) { 14 m = brr[i]; 15 n = brr[i+1]; 16 } else { 17 m = brr[i+1]; 18 n = brr[i]; 19 } 20 21 22 //求两个数的最大公约数 23 c = m, e = n, f = c; 24 while(c !== 0) { 25 f = e % c; 26 e = c; 27 c = f; 28 } 29 30 //求两个数的最小公倍数 31 var d = m * n / e; 32 //alert(d); 33 brr.splice(0,2,d); 34 35 36 if(brr.length === 1) { 37 num = d; 38 break; 39 } 40 i = -1; 41 } 42 43 console.log(num); 44 return num; 45 }
函数smallestCommons()接收一个数组参数,这个数组包含两项,这个函数的作用是找出这两项之间连续数字的最小公倍数,最后返回这个最小公倍数。
比如:
smallestCommons([1, 13]);//返回 360360。
标签:答案 alert common dex .com i++ question 区别 ons
原文地址:http://www.cnblogs.com/fogwind/p/6092845.html