Найти все совершенные числа, меньшие 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; >