Напечатать все пары дружественных чисел - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Дано натуральное число n. Напечатать все пары дружественных чисел, не превосходящих n (два натуральных числа называются дружественными, если каждое из них равно сумме делителей другого, исключая сами числа).

Решение задачи: «Напечатать все пары дружественных чисел»

textual
Листинг программы
uses System.Linq;
type P = KeyValuePair<integer, integer>;
 
begin
  var n := ReadLnInteger('n = ');
  var dividers := Enumerable.Range(1, n).Select(number -> new P(number, 
                                                Enumerable.Range(1, number - 1).Where(i -> (number mod i) = 0).Sum()));
                                                    
  var dic := dividers.ToDictionary(pair -> pair.key, pair -> pair.Value);
  dic.Add(0, 0);
  foreach var T in dic do
    if T.Value <= n then
    begin
      var V := dic[T.Value];
      if (V = T.Key) and (V <> T.Value) {and (V < T.Value)} then writeln(T.Key, ' ', T.Value);
    end;
end.

Объяснение кода листинга программы

Код решает задачу поиска всех пар дружественных чисел.

  1. uses System.Linq; — подключаем пространство имен для работы с последовательностями
  2. type P = KeyValuePair<integer, integer>; — определяем тип для хранения пар чисел
  3. var n := ReadLnInteger('n = '); — считываем из консоли число n, которое равно количеству чисел для проверки на дружественность
  4. var dividers := Enumerable.Range(1, n).Select(number -> new P(number, — создаем последовательность делителей для каждого числа от 1 до n
  5. Enumerable.Range(1, number — 1).Where(i -> (number mod i) = 0).Sum())); — вычисляем сумму делителей числа
  6. var dic := dividers.ToDictionary(pair -> pair.key, pair -> pair.Value); — преобразуем последовательность в словарь, где ключи — это числа, а значения — их сумма делителей
  7. dic.Add(0, 0); — добавляем пару (0, 0) в словарь, так как любое число делится на 0
  8. foreach var T in dic do — проходим по всем парам чисел в словаре
  9. if T.Value <= n then — проверяем, чтобы значение не превышало число n
  10. var V := dic[T.Value]; — получаем соответствующее число из словаря
  11. if (V = T.Key) and (V <> T.Value) {and (V < T.Value)} then writeln(T.Key, ' ', T.Value); — выводим пару чисел на экран, если они являются дружественными (равны по модулю, но не равны друг другу и меньше n)

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы