У меня есть задача найти пары дружных чисел, и я уже решил ее.Мое решение неэффективно, поэтому, пожалуйста, помогите мне ускорить мой алгоритм.
Достижимые числа - это два разных числа, связанных так, что сумма правильных делителей каждого равна другому числу.Наименьшая пара дружных чисел - (220, 284).Они дружны, потому что правильными делителями 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, из которых сумма равна 284;а правильными делителями 284 являются 1, 2, 4, 71 и 142, из которых сумма равна 220.
Задача: два long
числа и найти первые дружные числа между ними.Пусть s (n) будет суммой правильных делителей числа n:
Например:
s(10) = 1 + 2 + 5 = 8
s(11) = 1
s(12) = 1 + 2 + 3 + 4 + 6 = 16
Если s(firstlong) == s(secondLong)
, то они являются дружными числами
Мой код:
public static IEnumerable<long> Ranger(long length) {
for (long i = 1; i <= length; i++) {
yield return i;
}
}
public static IEnumerable<long> GetDivisors(long num) {
return from a in Ranger(num/2)
where num % a == 0
select a;
}
public static string FindAmicable(long start, long limit) {
long numberN = 0;
long numberM = 0;
for (long n = start; n <= limit; n++) {
long sumN = GetDivisors(n).Sum();
long m = sumN;
long sumM = GetDivisors(m).Sum();
if (n == sumM ) {
numberN = n;
numberM = m;
break;
}
}
return $"First amicable numbers: {numberN} and {numberM}";
}