Проверка числа на совершенность - C (СИ)
Формулировка задачи:
Задача: использовать функцию, которая определяет, является ли введённое число совершенным или нет + в ней отобразить все совершенные числа в диапазоне от 1 до 1000.
Первая часть у меня получилась, а вот вывести остальные числа что-то не очень вышло..
#include <stdio.h> #include <conio.h> #include <locale.h> #include <math.h> void sov(int); int main () { int num; setlocale(LC_ALL,"russian"); printf("Введите число \n"); scanf_s("%d",&num); sov(num); _getch(); return 0; } void sov(int num) { int sum=0,num2,sum2=0; for (int i=1;i<num;i++) { if (num%i==0) { sum=sum+i; } } if (sum==num) printf("Ваше число совершенно!"); else printf("Ваше число несовершенно!"); printf("Список совершенных чисел до 1000: "); for (int num2=2;num2<=1000;num2++) { for (int i=1;i<num2;i++) { if (num2%i==0) { sum2=sum2+i; if (sum2==num2) printf("%d ",num2); } } } }
Решение задачи: «Проверка числа на совершенность»
textual
Листинг программы
/* функция проверки числа на сорвершенство */ static inline int isperfect(int n) { int sum = 0, i = 1; for(; i <= n / 2; i++) if(n % i == 0) sum += i; return sum == n; } /* функция проверки чисел, меньших и равно high на совершенство */ static inline void foo(int high) { int i = 1; /* если high < 0 вызываем эту же функцию с положительным high */ if(high < 0) foo(-high); /* если high == 0 просто выходим */ if(high == 0) return; /* прогоняем цикл от 1 до high */ for(; i <= high; i++) /* если число совершенное */ if(isperfect(i)) /* просим его распечатать */ printf("%4i", i); /* переводим курсор на новую строку */ puts(""); return; }
Объяснение кода листинга программы
- Функция
isperfect
проверяет число на совершенство, используя формулу суммы делителей. - Переменная
sum
инициализируется как 0, а переменнаяi
как 1. - В цикле
for
с условиемi <= n / 2
проверяется каждый делительi
числаn
. - Если
n % i == 0
, то делительi
добавляется кsum
. - Функция возвращает
sum == n
. - Функция
foo
проверяет числа, меньшие и равныеhigh
, на совершенство. - Если
high < 0
, то вызывается функцияfoo
с аргументом-high
. - Если
high == 0
, то функция просто возвращает управление. - Цикл
for
с условиемi <= high
проходит от 1 доhigh
. - Если число
i
является совершенным (то есть функцияisperfect
возвращает 1), то оно выводится на экран с помощью функцииprintf
. - После окончания цикла курсор переводится на новую строку с помощью функции
puts
. - Функция
foo
возвращает управление. - В основной программе вызывается функция
foo
с аргументом 20, чтобы проверить все числа от 1 до 20 на совершенство. - Каждое совершенное число выводится на экран.
- В результате выполнения программы на экран выводится список совершенных чисел от 1 до 20.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д