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

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

  1. Функция isperfect проверяет число на совершенство, используя формулу суммы делителей.
  2. Переменная sum инициализируется как 0, а переменная i как 1.
  3. В цикле for с условием i <= n / 2 проверяется каждый делитель i числа n.
  4. Если n % i == 0, то делитель i добавляется к sum.
  5. Функция возвращает sum == n.
  6. Функция foo проверяет числа, меньшие и равные high, на совершенство.
  7. Если high < 0, то вызывается функция foo с аргументом -high.
  8. Если high == 0, то функция просто возвращает управление.
  9. Цикл for с условием i <= high проходит от 1 до high.
  10. Если число i является совершенным (то есть функция isperfect возвращает 1), то оно выводится на экран с помощью функции printf.
  11. После окончания цикла курсор переводится на новую строку с помощью функции puts.
  12. Функция foo возвращает управление.
  13. В основной программе вызывается функция foo с аргументом 20, чтобы проверить все числа от 1 до 20 на совершенство.
  14. Каждое совершенное число выводится на экран.
  15. В результате выполнения программы на экран выводится список совершенных чисел от 1 до 20.

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


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

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

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