首先,要想计算最大公约数和最小公倍数,我们可以利用分解质因子的方式,获取两个数的所有质因子,而两个数的最大公约数是两个数相同的质因子的乘积,最小公倍数则是两个数的相同质因子的乘积再乘以他们各自特有的质因子。
比如24和36这两个数,24的质因子是【2,2,2,3】,32的质因子是【2,2,3,3】。两个数的共同质因子是【2,2,3】,因此他们的最大公约数是2*2*3 = 12,两个数特有的质因子是【2】和【3】,因此他们的最小公倍数就是2*2*3*2*3 = 72。
清楚以上知识点之后我们就可以往下进行了,下面以‘ 1254,366 ’这两个数为例计算最大公约数和最小公倍数
主函数
主函数中,利用了三个数组,前两个用来存放各自的质因子,第三个数组用来提取出来他们共同的质因子,并且将这些共同的质因子在他们各自的原数组中删除,这样第一个和第二个数组中最后就只剩下他们各自特有的质因子了,在进行质因子相乘,就可以得到最终结果了。
function CommonNumber(num1,num2){
let arr1 = [] //存放num1的质因子
let arr2 = [] //存放num2的质因子
let arr3 = [] //存放num1和num2的共同质因子
let Num = 1
let Multiplier = 1
Decompositionfactor(num1,arr1)
Decompositionfactor(num2,arr2)
console.log(arr1,arr2)
for(let i = 0;i<arr1.length;i++){
for(let j = 0;j<arr2.length;j++){
if(arr1[i] == arr2[j]) {
arr3.push(arr2[j])
arr2.splice(arr2.indexOf(arr2[j]),1)
arr1.splice(arr1.indexOf(arr1[i]),1)
i--
break
}
}
}
console.log(arr3)
for(let i=0;i<arr3.length;i++){
Num *= arr3[i]
}
for(let i=0;i<arr1.length;i++){
Multiplier *= arr1[i]
}
for(let i=0;i<arr2.length;i++){
Multiplier *= arr2[i]
}
Multiplier *= Num
console.log(Num,Multiplier)
}
分解质因子
首先这个方法利用了递归的思想,递归结束的条件就是传入的num<=2时return。我们要判断传入的数字是否是质数,如果是质数,就直接存入数组中,否则就将其两个除数继续传入这个方法中,直到他们变成不可再除的质因子存入数组中
function Decompositionfactor(num,arr) {
if(num<=2) {
arr.push(num)
return
}
let a = 0
let b = 0
let i = 2
bool = true
while(i<num/2) {
if(num%i == 0) {
bool = false
break
}
i++
}
if(bool){
a = num
arr.push(a)
return
}else {
a = i
b = num/i
Decompositionfactor(a,arr)
Decompositionfactor(b,arr)
}
}
控制台的打印结果可以看到,对1254执行分解质因子的函数后,其分解为了 【2,3,11,19】,对366执行了分解质因子的函数后,其分解为了 【2,3,61】,因此他们的最大公约数就是2*3 = 6,最小公倍数就是2*3*11*19*61=76494