描述
给定一个正整数的数组X,它的元素将通过对它们执行以下操作来转换所需的次数:
if X[i] > X[j] then X[i] = X[i] - X[j]
如果无法进行更多转换,则返回其总和(“最小可能总和”)。
例如,输入X = [6,9,21]的元素的连续变换详述如下:
X_1 = [6, 9, 12] # -> X_1[2] = X[2] - X[1] = 21 - 9
X_2 = [6, 9, 6] # -> X_2[2] = X_1[2] - X_1[0] = 12 - 6
X_3 = [6, 3, 6] # -> X_3[1] = X_2[1] - X_2[0] = 9 - 6
X_4 = [6, 3, 3] # -> X_4[2] = X_3[2] - X_3[1] = 6 - 3
X_5 = [3, 3, 3] # -> X_5[1] = X_4[0] - X_4[1] = 6 - 3
返回的输出是最终转换的总和(这里是9)。
例:
solution([6, 9, 21]) #-> 9
解决步骤:
[6, 9, 12] #-> X[2] = 21 - 9
[6, 9, 6] #-> X[2] = 12 - 6
[6, 3, 6] #-> X[1] = 9 - 6
[6, 3, 3] #-> X[2] = 6 - 3
[3, 3, 3] #-> X[1] = 6 - 3
补充说明:
有一些性能测试包括非常大的数字和大小至少为30000的数组。请编写一个有效的算法来防止超时。
解答:
function solution(numbers) {
let length = numbers.length;
let temp = numbers[0];
numbers.sort(function(a,b){
return a-b;
})
for(let i = 0;i<length-1;i++){
let max = numbers[i+1];
let min = temp;
while(max%min !=0){
temp = max%min;
max = min;
min = temp;
}
}
return temp*length
}