Проверка числа на совершенность - 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.