Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ нахождение полных чисел

Автор: -Artur- 9.12.2007 6:23

Доброго времени суток !
Срочно нужна помощь.
Задача: Полные числа - это такие числа которые равны всем своим делителям (за исключением самого себя). Пример: 6=3+2+1 (6 делится на 3, 2 и 1). Найти все полные числа от 1 до 10000. Ответы даны: 6, 28, 496, 8128.
Не имею представления как написать такую программу в паскале, что бы она нашла эти числа.
Помогите пожалуйста, буду очень благодарен.
Заранее спасибо ! smile.gif

Автор: volvo 9.12.2007 6:26

Вообще-то эти числа называются "Совершенные": http://forum.pascal.net.ru/index.php?s=&showtopic=3916&view=findpost&p=32236

Автор: -Artur- 9.12.2007 6:56

Спасибо volvo, очень помогло.
использовал эту программу:
Var
I,N,Summa: LongInt;
Delitel: Integer;
Begin
For I := 1 To 10000 Do Begin
Summa := 1;
For Delitel := 2 To Trunc(Sqrt(I)) Do Begin
N := (I Div Delitel);
If N * Delitel = I Then Summa := Summa + Delitel + (I Div Delitel);
End;

If Int(Sqrt(I)) = Sqrt(I) Then Summa := Summa - Trunc(Sqrt(I));

If I = Summa Then WriteLn(I, ' - ', Summa);
End;
End.

Программа показывает числа так:
6 - 6
28 - 28
496 - 496
8128 - 8128

Можно ли сделать что бы эти числа писались 1 раз, а не 2 раза через дефиз ? (А то учитель может придраться :D )
И после этого выйти из программы нельзя. Прописал в конце readln; не помогло.
И последнее, к программе мне нужно написать описание каждой строчки, тоесть что каждая строчка выпоняет (описать эти команды). Ну строки var, begin, и end я описать могу :D А вот во всех формулах и кодах которые тут присутствуют я не шарю. Может кто - то поможет? А то без описания строк работу не примут. :/

P.S volvo пробывал использовать твою программу (то что добавлено), там и строки описаны, но она у меня не работает. Хотя я просто скопировал всю программу от начала до конца, может чего лишнего взял (так как не понимаю толком smile.gif )

Автор: -Artur- 9.12.2007 7:06

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

Автор: Michael_Rybak 9.12.2007 7:17

прочитай хоть что-нибудь сам по паскалю. про структуру программы вообще, про арифметические операции, про if-then-else, for-do и writeln. и сам напиши комментарии.

Автор: -Artur- 9.12.2007 7:28

да согласен, прочитать мне не помешает, но на это время нужно, а мне к понедельнику сделать надо.
Впочем мне нужно всего несколько описаний:
I,N,Summa: LongInt; - вот эта строчка нужна, не понимаю что она означает.
И соответственно исходя из этой строчки что значит For I :=
Ещё не знаю N := (I Div Delitel); - что такое div не знаю.
If Int(Sqrt(I)) = Sqrt(I) - и вот это неопнтяно.
Всего несколько строк, очень нужно :/
И как сделать что бы числа писались 1 раз через запятую или в столбик неважно, но 1 раз, а не повторно через тире.

Автор: Michael_Rybak 9.12.2007 7:38

Что такое "I,N,Summa: LongInt;" ты узнаешь, потратив 5 полезных минут на ознакомление со структурой программ на паскале. Так и напиши в гугле - "паскаль. структура программы".

Что такое for ты узнаешь, ознакомившись с конструкцией for-do.

Что такое div ты узнаешь, ознакомившись с арифметическими операциями.

If Int(Sqrt(I)) = Sqrt(I) - эта строчка означает - "Если I является полным квадратом, то...". Более конкретно - Sqrt(I) вычисляет квадратный корень из I. Int(Sqrt(I)) берет от квадратного корня целую часть. Таким образом, вся строка означает дословно - "Если целая часть квадратного корня из I равна квадратному корню из I, то ...". Другими словами, "Если квадратный корень из I - целое число, то...".

До понедельника времени - море.

Удачи.

Автор: -Artur- 9.12.2007 7:40

Спасибо smile.gif