Математическая задача |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Математическая задача |
Игорь |
Сообщение
#1
|
Гость |
Помогите пожалуйста с задачей:
Определить, является ли заданное натуральное число совершенным, т.е. Равным сумме всех своих (положительных) делителей, кроме самого этого числа (напр. Число 6 совершенно: 6=1+2+3). |
volvo |
Сообщение
#2
|
Гость |
Если "в лоб" -
Но может существует и другое решение. А вообще-то их не так уж много (я знаю всего 5 из тех, которые помещаются в LongInt). Может, имеет смысл проверять напрямую? |
Игорь |
Сообщение
#3
|
Гость |
Большое спасибо! А как по этому составить flow-схему и диаграмму Насси-Шнейдермана?
|
xds |
Сообщение
#4
|
N337 Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: 26 |
Решение "в лоб" для n = 33550336 уже немного задумывается. Слегка оптимизируем:
Код program PerfNum; label Cont; var n, l, r, d, s: LongInt; begin Write('n>'); Readln(n); l := 1; r := n div 2; s := 1; while l < r do begin for d := l + 1 to r - 1 do if n mod d = 0 then begin l := d; r := n div d; if l = r then Inc(s, l) else Inc(s, l + r); goto Cont; end; Break; Cont: end; if (n <> 1) and (s = n) then Writeln('Число ', n, ' - совершенное') else Writeln('Число ', n, ' не является совершенным'); end. Сообщение отредактировано: xds - -------------------- The idiots are winning.
|
xds |
Сообщение
#5
|
N337 Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: 26 |
Впрочем, если n типа LongInt, то почему бы не так:
program PerfNum2; :P -------------------- The idiots are winning.
|
Caries |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Цитата(xds @ 15.10.04 17:02) Решение "в лоб" для n = 33550336 уже немного задумывается. Слегка оптимизируем: Вопрос: вот в некоторых книгах пишут что goto использовать не рекомендуется, можно ли в данном случае обойтись без него? |
Флогримм |
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: 4 |
Цитата Вопрос: вот в некоторых книгах пишут что goto использовать не рекомендуется, можно ли в данном случае обойтись без него? не рекомендуется использовать сложные, запутанные структуры с гоуту, а когда оно один-два раза в программе применяется, ИМХО, ничего страшного и ваапче енто есть мнение расхожее -------------------- Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
|
Altair |
Сообщение
#8
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Нет, или мы пишем код на Паскале, по принципу структурного программирования, или мы берем тогда Бейсик
Убрать GOTO на фиг! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Caries |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Та же программа. Но с условием поиска совершенного числа меньше введенного юзверем.
Требуется при выводе совершенного числа вывести также его делители(т.е показать что в сумме они дают само число) Как это можно сделать? Я затрудняюсь. Вот код исходной программы котрую нужно модифицировать: Код 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. Заранее спасибо Сообщение отредактировано: Caries - |
Caries |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
неужели никто не знает?
|
FreeMan |
Сообщение
#11
|
- Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: 4 |
В цикле дели на 10 и выводи остаток от деления
while x<>0 do begin -------------------- бб
|
Гость_Caries |
Сообщение
#12
|
Гость |
Можно поподробнее?
|
FreeMan |
Сообщение
#13
|
- Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: 4 |
Program semestr; так вроде. -------------------- бб
|
Caies |
Сообщение
#14
|
Гость |
Закомпилил. Выдает чепуху при вводе напрример 8 выдаст 6 6. Вы сами компилили?
|
Гость_Caries |
Сообщение
#15
|
Гость |
Может я просто неграмотно описал то что требуется? сейчас выводит просто числа в ряд 6 , 28,
Требуется чтобы выводилось так 6=1+2+3 28=1+2+4+7+14 и тд. |
FreeMan |
Сообщение
#16
|
- Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: 4 |
замени
while s<>0 do begin на while s<>1 do begin Цитата Закомпилил. Выдает чепуху при вводе напрример 8 выдаст 6 6. Вы сами компилили? Я код не проверяю... Но в данном случае сработала, как задумано, просто я не понял вопрос. З.Ы. Можно на "ты" -------------------- бб
|
Guest |
Сообщение
#17
|
Гость |
Млин. При 6 все нормально выдает 1 2 3
если вводим 9 то выдаст 1 2 3 1 7 1 2 |
volvo |
Сообщение
#18
|
Гость |
Guest
Попробуй вот так:
|
Текстовая версия | 23.12.2024 19:44 |