Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Pascal.Поиск совершенного числа.

Автор: Sehnsucht
Дата сообщения: 09.11.2004 17:22
Дано натуральное число N. Получить все совершенные числа меньшие N. Натуральное число называется совершенным, если оно равно сумме своих делителей, за исключением себя самого. Например, 6=1+2+3 – совершенное.

Как? извиняюсь если подобная тема пробегала...
Автор: Nvc
Дата сообщения: 09.11.2004 17:44
1. Ищем делители
2. Сравниваем их сумму с числом.

Проверка числа:

Код:
n_in := n;
i := 2;
r := 1;
while i < n do
begin
if n mod i = 0 then
begin
n := n/i;
r := r*i;
end else inc(i);
end;
if r = n_in then result := true;
Автор: Sehnsucht
Дата сообщения: 09.11.2004 19:43
а поподробнее можно?
Автор: Nvc
Дата сообщения: 09.11.2004 22:49
Sehnsucht
Поподробнее - ето уже будет весь листинг программы. Основа уже есть ;)
Автор: Sehnsucht
Дата сообщения: 12.11.2004 15:38
мне просто смысл написанного уже непонятен. Опиши пожалуйста действия и переменные.
Автор: A_V
Дата сообщения: 12.11.2004 19:23
когдато давно писал в школе на кубасике, думаю на паскаль перевести не проблема:

--cut--
DEFDBL A-Z

Start = 0

CLS
OPEN "sov.chi" FOR OUTPUT AS #1
PRINT #1, "Найденные совершенные числа:"

Start = 33550000 'незадолго перед последним найденным -)

IF Start > 6 THEN PRINT #1, 6
IF Start > 28 THEN PRINT #1, 28
IF Start > 496 THEN PRINT #1, 496
IF Start > 8128 THEN PRINT #1, 8128

COLOR 12, 1: PRINT " Программа поиска совершенных чисел "
LOCATE 25: PRINT " ESC - выход ";
COLOR 7, 0
t = 2

FOR chisl = Start TO 999999999#
sum = 1
D = SQR(chisl)

IF chisl / 2 = chisl \ 2 OR INT(D) < D THEN 'вобщето нечетных сов. чисел до 10^36 нет

FOR div = 2 TO INT(D)
IF chisl / div = chisl \ div THEN
sum = div + sum
div2 = chisl / div
IF div = div2 THEN div2 = 0
sum = sum + div2
END IF
NEXT
END IF
IF chisl = sum THEN COLOR 15: t = t + 1: LOCATE t, 1: PRINT sum; "- совершенное": PLAY "ac6": PRINT #1, sum
COLOR 7: LOCATE t + 1, 1: PRINT chisl
IF INKEY$ = CHR$(27) THEN CLOSE : END
NEXT
--cut--

зы: вот все совершенные числа, которые у меня получилось найти вышеописанным способом:
6
28
496
8128
33550336
Автор: JustAMaaan
Дата сообщения: 15.11.2004 08:33
ИМХО есть смысл поискать в библиотеках "Детскую энциклопедию" советских времен, том "астрономия и математика". Там было какое-то выражение (вроде бы 2^N-2^что-то еще), которому удовлетворяют все совершенные числа, за счет чего можно офигенно сократить количество проверок. Однако за давностью лет подробности не помню.
Автор: Dimasty
Дата сообщения: 16.11.2004 12:16

Цитата:
Там было какое-то выражение (вроде бы 2^N-2^что-то еще)

это числа Мерсенна
вот здесь кое-что было http://www.erudition.ru/referat/ref/id.52571_1.html
Автор: JustAMaaan
Дата сообщения: 17.11.2004 09:26

Цитата:
то числа Мерсенна
вот здесь кое-что было http://www.erudition.ru/referat/ref/id.52571_1.html

В ДЭ было только про совершенные:
6=2^3-2^1
28=2^5-2^2
496=2^9-2^4
8128=2^13-2^6
и т.д.
Автор: Sehnsucht
Дата сообщения: 21.11.2004 15:45
написал, но почему то не выводит нужные числа. Что не так?

Цитата:
Program semestr;
var i,n,s,z:longint;
begin
writeln('vvedi chislo');
readln(n);
s:=1;
for z:=1 to n do
for i:=2 to (z div 2) do
if (z mod i) = 0 then inc(s,i);
If s=z then
writeln(z)
else;
end.

Автор: raven
Дата сообщения: 21.11.2004 20:06

Код: Program semestr;
var i,n,s,z:longint;
begin
writeln('vvedi chislo');
readln(n);
for z:=1 to n do begin
s:=1;
for i:=2 to (z div 2) do if (z mod i) = 0 then inc(s,i);
If s=z then writeln(z)
end;
readln;
end.
Автор: A_V
Дата сообщения: 21.11.2004 20:19
опередили
Автор: Sehnsucht
Дата сообщения: 21.11.2004 21:11
СПС! )
Автор: Sehnsucht
Дата сообщения: 22.11.2004 15:19
ЕЩе одна проблема: при введении числа например 345678 программка немного задумывается. Можно как то ее оптимизировать?
Автор: UncoNNecteD
Дата сообщения: 22.11.2004 16:55

Цитата:
Можно как то ее оптимизировать?

Создай базу данных совершенных чисел
Автор: Sehnsucht
Дата сообщения: 22.11.2004 17:16
можно))))) но как то извращенно. да и препод рад не будет.
Автор: A_V
Дата сообщения: 22.11.2004 18:24
более оптимальный вариант есть здесь:
http://www.computerra.ru/offline/2001/407/11921/

в тексте программы придется изменить SQRT(I) на Round(SQRT(I))
Автор: Sehnsucht
Дата сообщения: 15.12.2004 19:24
Та же программа.
Требуется при выводе совершенного числа вывести также его делители(т.е показать что в сумме они дают само число)
Как это можно сделать. Я затрудняюсь.
Вот код исходной программы котрую нужно модифицировать:

Код
Program semestr;
var i,n,s,z:Integer;
begin
writeln('DANNAJA PROGRAMMA HAXODIT COBEPSHEHHIE CHISLA');
WRITELN('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^');
writeln('vvedite chislo');
readln(n);
if n<6 then writeln('sovversh chisel net')
else
writeln('Perfect Chisla menshie n');
for z:=6 to n do begin
s:=1;
for i:=2 to (z div 2) do
if (z mod i) = 0 then inc(s,i);
If s=z then
writeln(z) end;
readln;
end.

Страницы: 1

Предыдущая тема: VB 6.0: Проблема с ADODB.Connection


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.