Цикл: найти с число с максимальным числом четных делителей - C (СИ)

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

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

Найти натуральное число от 1 до N c максимальным числом четныx делителей.

Решение задачи: «Цикл: найти с число с максимальным числом четных делителей»

textual
Листинг программы
  1. /*
  2.  ============================================================================
  3.  Name        : c_struct.c
  4.  Author      : UranFlex
  5.  Version     : 0.й alpha
  6.  License     : Free for all
  7.  Copyright   : UranFlex 2013
  8.  Description : Найти натуральное число от 1 до N c максимальным числом четныx делителей.
  9.  *             В задаче рассмотрены только положительные четные делители числа, т.е отрицательные не рассматриваются
  10.  *             C, Ansi-style
  11.  ============================================================================
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16.  
  17. // структура для хранения числа и количества его четных положительных делителей
  18. typedef struct {
  19.     unsigned value; // число
  20.     unsigned countDivisor; // количество четных положительных делителей
  21. } Pair;
  22.  
  23. // функция возвращает количество положительных четных делителей числа value,
  24. // само value также рассматривается в качестве делителя если value имеет четное значение
  25. // данная функция использует самый простой в реализации алгоритм, но далеко не самый эффективный при выполнении
  26. unsigned CountEvenDivNatNum( const int value );
  27. // функция возвращает структуру, содержащую в своих полях:
  28. //  1) число из диапазона [ 2..value ] c максимальным количеством положительных четныx делителей,
  29. //      причем если имеются несколько таких чисел, то берется минимальное из них
  30. //  2) и это максимальное количество четных делителей
  31. // то есть функция будет работать только для натуральных чисел больших 1,
  32. // а для меньших или равных 1 будет возращать структуру, содержащую в своих полях:
  33. //  1) 0
  34. //  2) 0
  35. // так как такие числа не входят в диапазон [ 2..value ]
  36. Pair MaxCountEvenDivNatNum( const int value );
  37.  
  38. int main( void ) {
  39.  
  40.     // ввод числа
  41.     int n;
  42.     printf( "Введите целое положительное число большее 1 " );
  43.     scanf( "%d", &n );
  44.  
  45.     if ( n < 2 ) { // проверяем чтобы число было не меньше 2
  46.         puts( "Ошибка - неверный ввод!" );
  47.         return EXIT_FAILURE;
  48.     }
  49.     // находим искомое число с максимальным числом положительных четных делителей из диапазона [ 2..n ]
  50.     // а также само количество этих положительных четных делителей
  51.     Pair number = MaxCountEvenDivNatNum( n );
  52.     // выводим результаты
  53.     printf( "Число из диапазона [ 2..%d ] с максимальным количеством четныx делителей = %u\n", n, number.value );
  54.     printf( "Количество его четных положительных делителей = %u\n", number.countDivisor );
  55.  
  56.     return EXIT_SUCCESS;
  57. }
  58.  
  59. unsigned CountEvenDivNatNum( const int value ) {
  60.     int i; // счетчик цикла
  61.  
  62.     // если оно меньше 2, то мы его не рассматриваем
  63.     if ( value < 2 || value % 2 ) // или если число нечетное, то оно не имеет четных делителей
  64.         return 0; // возвращаем 0
  65.  
  66.     // количество положительных четных делителей числа
  67.     unsigned counter = 1; // если число четное, то как минимум есть один положительный четный делитель - оно само
  68.     // счетчик цикла увеличиваем на 2 в каждой итерации
  69.     for ( i = 2; i <= value / 2; i += 2 ) // так как рассматриваем только положительные четные делители
  70.         if ( value % i == 0 ) // если остаток от деления value на 2 равен 0, значит это очередной делитель
  71.             ++counter; // тогда и увеличиваем количество положительных четных делителей
  72.  
  73.     return counter; // возвращаем количество положительных четных делителей
  74. }
  75.  
  76. Pair MaxCountEvenDivNatNum( const int value ) {
  77.     int i; // счетчик для перебора всех чисел из диапазона [ 2..value ]
  78.     Pair sought = { 0, 0 }; // объект для хранения искомого числа и колисества его положительных четных делителей
  79.  
  80.     for ( i = 2; i <= value; ++i ) { // перебираем все числа из диапазона [ 2..value ]
  81.         unsigned count = CountEvenDivNatNum( i ); // узнаем сколко положительных четных делителлей у очередного числа из диапазона [ 2..value ]
  82.         if ( count > sought.countDivisor ) { // если число положительных четных делителей у очередного числа больше чем мы в прошлый раз запомнили
  83.             sought.value = i; // тогда запоминаем это число
  84.             sought.countDivisor = count; // и количество его делителей положительных четных делителей
  85.         }
  86.     }
  87.  
  88.     return sought; // возвращаем результат
  89. }

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

  1. Структура для хранения числа и количества его четных положительных делителей называется Pair.
  2. Функция CountEvenDivNatNum() возвращает количество положительных четных делителей числа value.
  3. Функция MaxCountEvenDivNatNum() возвращает структуру, содержащую в своих полях:
    • число из диапазона [ 2..value ] c максимальным количеством положительных четныx делителей,
    • и это максимальное количество четных делителей.
  4. В функции main() происходит ввод числа n с клавиатуры, проверка корректности ввода и вывод результатов.
  5. Цикл в функции MaxCountEvenDivNatNum() перебирает все числа из диапазона [ 2..value ] и проверяет количество их положительных четных делителей.
  6. Если число положительных четных делителей у очередного числа больше чем мы в прошлый раз запомнили, то тогда запоминаем это число и количество его делителей положительных четных делителей.
  7. Результатом работы функции MaxCountEvenDivNatNum() является структура, содержащая в своих полях:
    • искомое число с максимальным числом положительных четных делителей из диапазона [ 2..n ],
    • и само количество этих положительных четных делителей.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

15   голосов , оценка 3.8 из 5

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

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

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