视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript趣题:最小公分母
2020-11-27 20:25:45 责编:小采
文档

你有一个列表,里面的每一对数都代表了一个分数的分子与分母:

[ [numer_1, denom_1] , ... [numer_n, denom_n] ]

所有的数字都是正整数。

你得找出最小的公分母D,并用D替换原来的分母denom,并且改变分子numer,使得他们表示的数值不变。

例如:

[ [1, 2], [1, 3], [1, 4] ] // => (6,12)(4,12)(3,12)

在这里,2,3,4的最小公分母是12,所以分母改为12,同时分子相应做出改变,以维持数值不变。

1/2和6/12是一样大的,1/3和4/12也一样大。

这个题目关键是找最小公分母,或者说所有分母的最小公倍数。

所以,我们首先需要一个求最小公倍数的scm方法,它接收一个数组作参数。

它从数组最大的元素开始累加,看是否每一个数组元素都能整除,如果能,那就是最小公倍数

//smallest common multiple 
function scm(array){ 
 var max = Math.max.apply(null,array); 
 signal: 
 while(true){ 
 for(var i=0;i<array.length;i++){ 
 if(max % array[i]){ 
 max++; 
 continue signal; 
 } 
 } 
 return max; 
 } 
}

当然,这个方法效率不高,最好求最小公倍数的方法是借助最大公约数。

然后就好办了,取出列表中所有数组的第二项,也就是分母项,组成新数组,传入scm方法,得出最小公分母。

最后,遍历列表,拼接字符串就可以了。

function convertFrac(lst){ 
 var array = []; 
 var str = ""; 
 for(var i=0;i<lst.length;i++){ 
 array.push(lst[i][1]); 
 } 
 var result = scm(array); 
 for(var i=0;i<lst.length;i++){ 
 str += "(" + result / lst[i][1] * lst[i][0] + "," + result + ")"; 
 } 
 return str; 
}

下载本文
显示全文
专题