Перейти к содержимому

Как найти совершенное число в c

  • автор:

Найти все совершенные числа, меньшие N

Помогите. Столкнулся с очень странной проблемой своего рода. На лабораторную дали задачу. Теоретически все правильно написал, но, к сожалению, ответ выводится не всегда. Посмотрите, пожалуйста, в чем ошибка. Заранее спасибо! Найти все совершенные числа, меньшие N. Число называется совершенным, если оно равно сумме всех своих делителей за исключением самого числа. Например, 6=1+2+3 Вот сам код, который, к сожалению, не работает:

#include #include #include void main() < setlocale(LC_ALL,"RUSSIAN"); int N,i=1,sum=0,n=1; printf("введите N\n"); scanf("%d",&N); for (i=1;iif (i==sum) printf("совершенное %d\n", i); > > 

Программа на Си.
Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 6 окт 2014 в 11:48
OverLoader OverLoader
765 4 4 золотых знака 23 23 серебряных знака 50 50 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вы забываете обнулять сумму делителей, в результате чего она постепенно накапливается. Исправьте ваши циклы примерно так:

for (i = 1; i if (i == sum) printf("совершенное %d\n", i); > 

Кстати, в плане производительности алгоритм может быть существенно улучшен, например, тем, что во втором цикле условием остановки можно указать не n < i , а n Отслеживать ответ дан 6 окт 2014 в 12:02 DreamChild DreamChild 36.2k 3 3 золотых знака 45 45 серебряных знаков 85 85 бронзовых знаков

@DreamChild, при таком (n < i/2) существенном улучшении число 6 перестанет быть совершенным. (видимо надо заменить условие с < на 6 окт 2014 в 12:18 @avp да, разумеется там должно быть не n < i/2, а n <= i/2 6 окт 2014 в 12:25

Не существует нечётных совершенных чисел меньше 10**1500 (единичка и полторы тысячи нулей) [Odd perfect numbers are larger than 10**1500 (2012)]. Для сравнения, самое большое число типа int имеет меньше чем 20 десятичных цифр (64bit int).

110 11100 111110000 1111111000000 1111111111111000000000000 111111111111111110000000000000000 1111111111111111111000000000000000000 1111111111111111111111111111111000000000000000000000000000000 . 

где p равны 2, 3, 5, 7, 13, 17, 19, 31. На настоящее время (2013), известно только 48 таких чисел. Используя простую таблицу и библиотеку, поддерживающую арифметику с большими числами (чтобы десятичное представление легко напечатать), можно написать программу, которая выводит все известные совершенные числа меньше заданного числа.

Все чётные совершенные числа известны до числа с 18304103 десятичных цифр
( ceil((p+(p-1))*log10(2)) ). Cамое большое известное совершенное число 1692963953. 6270130176 имеет 34850340 десятичных цифр — если это число в книжку записать, то по размеру примерно десять «Война и миръ» получится.

Совершенные числа на C++

Целое число называется совершенным, если его сомножители, включая 1 (но не само число) в сумме дают это число. Например, 6 – это совершенное число, так как 6 = 1 + 2 + 3. Напишите функцию is_perfect, которая определяет, является ли параметр number совершенным числом. Используйте эту функцию в программе, которая определяет и печатает все совершенные числа в диапазоне от 1 до 1000.

#include using namespace std; bool is_perfect(int num) < int sum = 0; //в цикле для полученного функцией аргумента //будем находить его сомножители, путем деления его на все //целые числа в интервале от 1 до самого числа for(int j = 1; j < num; j++) < if(num % j == 0) sum += j; >//если число и сумма его сомножителей равны - значит число совершенное if(sum == num) return true; return false; > int main() < for (int i = 1; i < 1000; ++i) < if (is_perfect(i)) < cout > >

Результат работы программы:

28.06.2019 в 19:47 #5692

1/2 часть цикла функции is_perfect работает впустую.
Из теории чисел известно, что все делители произвольного числа меньше половины этого числа, то есть j Учитывая этот факт, можно переписать is_perfect так:

bool is_perfect(int num) < int sum = 0; for (int j = 1; j > return sum == num; >

29.06.2019 в 06:07 #5693

Как найти совершенное число в c

«ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ PASCAL»

Начало > Глава II. Простые , Совершенные > Задачи с решениями

ГЛАВА II

ЗАДАЧИ С РЕШЕНИЯМИ
Совершенные числа

1. Найти произведение совершенных чисел из 10 случайных, взятых в интервале[1, 10].

Переход
Блок-схема

2. Поиск совершенных чисел в заданном с клавиатуры интервале.

Переход
Блок-схема

3. Из 10 случайных чисел в интервале [1, 10] найти количество совершенных. Пояснение: фактически надо найти количество шестерок. Ответ может быть таким: 6 6 6 kch=3

Переход
Блок-схема

4. Дано натуральное число N. Определить, является ли оно совершенным.

Переход
Блок-схема

5. Вычислить ch/8+4, где ch — четвертое совершенное число.

Переход
Блок-схема

1. Найти произведение совершенных чисел из 10 случайных, взятых в интервале[1, 10].

Ответ может быть таким:
8 9 9 1 5 4 10 9 1 9
совершенных чисел нет

8 1 3 1 9 6 8 6 8 2
произведение совершенных чисел=36

    i — делители;
    p — произведение чисел;
    ch — число;
    sum — сумма делителей >
    begin
    ch:= random(10)+1; write(ch:5);
    sum :=0;
    For i:=1 to ch-1 do

      if ch mod i =0 then sum:=sum +i;

    if p > 1 then writeln(‘произведение совершенных чисел=’,p)
    else writeln(‘совершенных чисел нет’)

    Наверх
    Блок-схема

    2. Поиск совершенных чисел в заданном с клавиатуры интервале.


      for num:=x1 to x2 do

        begin
        sum:=1;
        for i:=2 to (num-1) do

          if num mod i=0 then sum:=sum+i;

        Наверх
        Блок-схема

        3. Из 10 случайных чисел в интервале [1, 10] найти количество совершенных.

        Пояснение: фактически надо найти количество шестерок.
        Ответ может быть таким: 6 6 6 kch=3

          for n:=1 to 10 do
          begin

            ch:=random (10-1+1)+1;
            sum:=0;
            for i:=1 to ch-1 do

              if ch mod i=0 then sum :=sum+i;
              begin write(ch:5); inc(kch) end;

            Наверх
            Блок-схема

            4. Дано натуральное число N. Определить, является ли оно совершенным.

              Sum:=0;
              for i:=1 to n div 2 do

                if n mod I=0 then sum:=sum+i;

              Наверх
              Блок-схема

              5. Вычислить ch/8+4, где ch — четвертое совершенное число.

                koldel — количество делителей;
                del — делители;
                Sd — сумма делителей;
                k — количество чисел;>
                begin inc(ch);
                Sd:=0 ;
                for del:=1 to ch-1 do

                  if ch mod del=0 then Sd:=Sd + del;

                Наверх
                Блок-схема

                Как найти совершенное число в c

                Совершенные числа на C++

                Собственно такое задание (написать нужно на С++)

                Вывести на экран все двузначные числа, являющиеся совершенными (число называется совершенным, если оно равно сумме всех своих делителей за исключением самого себя). Описать метод вывода на экран числа, являющегося совершенным.

                Заранее спасибо.

                Пользователь

                Регистрация: 11.06.2010

                Сообщений: 78

                Slavytich и в чем у вас сложность при решении данной задачи?

                Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶

                Пользователь

                Регистрация: 28.10.2010

                Сообщений: 26

                Слишком мало знаний конкретно по С++, в связи с этим и возникают трудности, вроде логику понимаю, но как это реализовать — не знаю

                Пользователь

                Регистрация: 28.10.2010

                Сообщений: 26

                Максимум до чего я дошёл это :

                #include using namespace std; int main() < int j; int mas[100]; for (int i=10; i for (int i=1; i < 10; i++) < if (j % i =0) i = mas[i]; >return 0; >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *