Цикл: найти с число с максимальным числом четных делителей - 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; // возвращаем результат }
Объяснение кода листинга программы
- Структура для хранения числа и количества его четных положительных делителей называется Pair.
- Функция CountEvenDivNatNum() возвращает количество положительных четных делителей числа value.
- Функция MaxCountEvenDivNatNum() возвращает структуру, содержащую в своих полях:
- число из диапазона [ 2..value ] c максимальным количеством положительных четныx делителей,
- и это максимальное количество четных делителей.
- В функции main() происходит ввод числа n с клавиатуры, проверка корректности ввода и вывод результатов.
- Цикл в функции MaxCountEvenDivNatNum() перебирает все числа из диапазона [ 2..value ] и проверяет количество их положительных четных делителей.
- Если число положительных четных делителей у очередного числа больше чем мы в прошлый раз запомнили, то тогда запоминаем это число и количество его делителей положительных четных делителей.
- Результатом работы функции MaxCountEvenDivNatNum() является структура, содержащая в своих полях:
- искомое число с максимальным числом положительных четных делителей из диапазона [ 2..n ],
- и само количество этих положительных четных делителей.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д