возвратить массив из пар дружественных чисел
Необходимо реализовать функцию которая подсчитывает дружественные числа в заданном диапазоне,
Сигнатура функции - getFriendlyNumbers(start, end)
start - начало диапазона end - конец диапазона
Функция должна возвращать массив из пар дружественных чисел. Например:
- Для диапазона от 1 до 300 функция должна вернуть [[220, 284]]
- Для диапазона от 1 до 100 функция должна вернуть пустой массив. []
- Для диапазона от 284 до 500 функция должна вернуть пустой массив. []
- Для диапазона от 1 до 1211 функция должна вернуть [[220, 284], [1184, 1210]]
- И так далее по диапазонам.
В случае, если переданы не правильные аргументы (неправильный тип данных (только числа!), start > end, отрицательный диапазон, дробные числа), функция должна вернуть false.
Числа должны находится в правильном порядке. [284, 220] - неправильно. Пары дружественных чисел не должны повторяться. [[220, 284], [284, 220]] - неправильно.
У меня напросилось следующее решение
var mas = [];
function getFriendlyNumbers(start, end) {
if (
!isNaN(parseFloat(start)) &&
isFinite(start) &&
!isNaN(parseFloat(end)) &&
isFinite(end) &&
start <= end &&
start > 0 &&
end > 0
) {
while (start < end) {
var sum1 = getDivSum(start);
var sum2 = getDivSum(end);
if (start == sum2 && end == sum1) {
mas.push(sum2, sum1);
return mas;
} else {
return mas;
}
start++;
}
} else {
return [];
}
}
function getDivSum(num) {
return getSum(getDivisors(num));
}
function getDivisors(num) {
var arr = [];
for (var i = 1; i < num; i++) {
if (num % i == 0) {
arr.push(i);
}
}
return arr;
}
function getSum(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
Но почему-то не проходит тест даже 1, 1. В чём проблема?
Ответы (1 шт):
function getFriendlyNumbers(start, end) {
if (!isNaN(parseFloat(start)) &&
isFinite(start) &&
!isNaN(parseFloat(end)) &&
isFinite(end) &&
start <= end &&
start > 0 &&
end > 0
) {
var result = [];
var sumI, sumJ;
for (var i = start; i < end; i++) {
sumI = getSumDivisor(i);
for (var j = i + 1; j <= end; j++) {
sumJ = getSumDivisor(j);
if (sumI == j && sumJ == i) {
result.push([sumJ, sumI]);
}
}
}
return result;
}
return false;
}
function getSumDivisor(num) {
var arr = [];
var sum = 0;
for (var i = 1; i < num; i++) {
if (num % i == 0) {
arr.push(i);
}
}
arr.forEach(function(item) {
sum += item;
})
return sum;
}