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

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

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

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

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

textual
Листинг программы
/*
 ============================================================================
 Name        : c_struct.c
 Author      : UranFlex
 Version     : 0.й alpha
 License     : Free for all
 Copyright   : UranFlex 2013
 Description : Найти натуральное число от 1 до N c максимальным числом четныx делителей.
 *             В задаче рассмотрены только положительные четные делители числа, т.е отрицательные не рассматриваются
 *             C, Ansi-style
 ============================================================================
 */
 
#include <stdio.h>
#include <stdlib.h>
 
// структура для хранения числа и количества его четных положительных делителей
typedef struct {
    unsigned value; // число
    unsigned countDivisor; // количество четных положительных делителей
} Pair;
 
// функция возвращает количество положительных четных делителей числа value,
// само value также рассматривается в качестве делителя если value имеет четное значение
// данная функция использует самый простой в реализации алгоритм, но далеко не самый эффективный при выполнении
unsigned CountEvenDivNatNum( const int value );
// функция возвращает структуру, содержащую в своих полях:
//  1) число из диапазона [ 2..value ] c максимальным количеством положительных четныx делителей,
//      причем если имеются несколько таких чисел, то берется минимальное из них
//  2) и это максимальное количество четных делителей
// то есть функция будет работать только для натуральных чисел больших 1,
// а для меньших или равных 1 будет возращать структуру, содержащую в своих полях:
//  1) 0
//  2) 0
// так как такие числа не входят в диапазон [ 2..value ]
Pair MaxCountEvenDivNatNum( const int value );
 
int main( void ) {
 
    // ввод числа
    int n;
    printf( "Введите целое положительное число большее 1 " );
    scanf( "%d", &n );
 
    if ( n < 2 ) { // проверяем чтобы число было не меньше 2
        puts( "Ошибка - неверный ввод!" );
        return EXIT_FAILURE;
    }
    // находим искомое число с максимальным числом положительных четных делителей из диапазона [ 2..n ]
    // а также само количество этих положительных четных делителей
    Pair number = MaxCountEvenDivNatNum( n );
    // выводим результаты
    printf( "Число из диапазона [ 2..%d ] с максимальным количеством четныx делителей = %u\n", n, number.value );
    printf( "Количество его четных положительных делителей = %u\n", number.countDivisor );
 
    return EXIT_SUCCESS;
}
 
unsigned CountEvenDivNatNum( const int value ) {
    int i; // счетчик цикла
 
    // если оно меньше 2, то мы его не рассматриваем
    if ( value < 2 || value % 2 ) // или если число нечетное, то оно не имеет четных делителей
        return 0; // возвращаем 0
 
    // количество положительных четных делителей числа
    unsigned counter = 1; // если число четное, то как минимум есть один положительный четный делитель - оно само
    // счетчик цикла увеличиваем на 2 в каждой итерации
    for ( i = 2; i <= value / 2; i += 2 ) // так как рассматриваем только положительные четные делители
        if ( value % i == 0 ) // если остаток от деления value на 2 равен 0, значит это очередной делитель
            ++counter; // тогда и увеличиваем количество положительных четных делителей
 
    return counter; // возвращаем количество положительных четных делителей
}
 
Pair MaxCountEvenDivNatNum( const int value ) {
    int i; // счетчик для перебора всех чисел из диапазона [ 2..value ]
    Pair sought = { 0, 0 }; // объект для хранения искомого числа и колисества его положительных четных делителей
 
    for ( i = 2; i <= value; ++i ) { // перебираем все числа из диапазона [ 2..value ]
        unsigned count = CountEvenDivNatNum( i ); // узнаем сколко положительных четных делителлей у очередного числа из диапазона [ 2..value ]
        if ( count > sought.countDivisor ) { // если число положительных четных делителей у очередного числа больше чем мы в прошлый раз запомнили
            sought.value = i; // тогда запоминаем это число
            sought.countDivisor = count; // и количество его делителей положительных четных делителей
        }
    }
 
    return sought; // возвращаем результат
}

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

  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
Похожие ответы