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

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

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

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

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

textual
Листинг программы
  1. uses System.Linq;
  2. type P = KeyValuePair<integer, integer>;
  3.  
  4. begin
  5.   var n := ReadLnInteger('n = ');
  6.   var dividers := Enumerable.Range(1, n).Select(number -> new P(number,
  7.                                                 Enumerable.Range(1, number - 1).Where(i -> (number mod i) = 0).Sum()));
  8.                                                    
  9.   var dic := dividers.ToDictionary(pair -> pair.key, pair -> pair.Value);
  10.   dic.Add(0, 0);
  11.   foreach var T in dic do
  12.     if T.Value <= n then
  13.     begin
  14.       var V := dic[T.Value];
  15.       if (V = T.Key) and (V <> T.Value) {and (V < T.Value)} then writeln(T.Key, ' ', T.Value);
  16.     end;
  17. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы