IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Математическая задача
Игорь
сообщение 15.10.2004 14:49
Сообщение #1


Гость






Помогите пожалуйста с задачей:

Определить, является ли заданное натуральное число совершенным, т.е. Равным сумме всех своих (положительных) делителей, кроме самого этого числа (напр. Число 6 совершенно: 6=1+2+3).
 К началу страницы 
+ Ответить 
volvo
сообщение 15.10.2004 15:56
Сообщение #2


Гость






Если "в лоб" -


Var
 i, n: LongInt;
 s: LongInt;
BEGIN
 Write( 'Enter the number:' );
 ReadLn(n);

 s := 1;
 For i := 2 To (n div 2) Do
   If (n mod i) = 0 Then Inc(s, i);

 If s = n Then
   WriteLn( 'Yes.' )
 Else
   WriteLn( 'No.' );
END.



Но может существует и другое решение.
А вообще-то их не так уж много (я знаю всего 5 из тех, которые помещаются в LongInt). Может, имеет смысл проверять напрямую?
 К началу страницы 
+ Ответить 
Игорь
сообщение 15.10.2004 16:26
Сообщение #3


Гость






Большое спасибо! А как по этому составить flow-схему и диаграмму Насси-Шнейдермана?
 К началу страницы 
+ Ответить 
xds
сообщение 15.10.2004 17:02
Сообщение #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 - 15.10.2004 17:03


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 16.10.2004 2:37
Сообщение #5


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Впрочем, если n типа LongInt, то почему бы не так:
program PerfNum2;

var
 n: LongInt;

begin
 Write('n>');
 Readln(n);
 if (n = 6) or (n = 28) or (n = 496) or (n = 8128) or (n = 33550336) then
   Writeln('Число ', n, ' - совершенное')
 else
   Writeln('Число ', n, ' не является совершенным');
end.


:P


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Caries
сообщение 22.11.2004 15:59
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской

Репутация: -  0  +


Цитата(xds @ 15.10.04 17:02)
Решение "в лоб" для n = 33550336 уже немного задумывается.  Слегка оптимизируем:

Вопрос: вот в некоторых книгах пишут что goto использовать не рекомендуется, можно ли в данном случае обойтись без него?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Флогримм
сообщение 23.11.2004 6:22
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 253
Пол: Мужской

Репутация: -  4  +


Цитата
Вопрос: вот в некоторых книгах пишут что goto использовать не рекомендуется, можно ли в данном случае обойтись без него?

не рекомендуется использовать сложные, запутанные структуры с гоуту, а когда оно один-два раза в программе применяется, ИМХО, ничего страшного

и ваапче енто есть мнение расхожее


--------------------
Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 23.11.2004 8:33
Сообщение #8


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Нет, или мы пишем код на Паскале, по принципу структурного программирования, или мы берем тогда Бейсик smile.gif
Убрать GOTO на фиг! angry.gif


smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Caries
сообщение 15.12.2004 16:56
Сообщение #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 - 15.12.2004 21:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Caries
сообщение 16.12.2004 9:01
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской

Репутация: -  0  +


неужели никто не знает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
FreeMan
сообщение 16.12.2004 16:34
Сообщение #11


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


В цикле дели на 10 и выводи остаток от деления
while x<>0 do begin
writeln(x mod 10);
x:=x div 10;
end;


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость_Caries
сообщение 16.12.2004 17:12
Сообщение #12


Гость






Можно поподробнее?
 К началу страницы 
+ Ответить 
FreeMan
сообщение 16.12.2004 17:20
Сообщение #13


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


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 begin
writeln(z);
while s<>0 do begin
writeln(s mod 10, '  ');
s:=s div 10;
end;
end;
end;
readln;
end.

так вроде.


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Caies
сообщение 16.12.2004 17:42
Сообщение #14


Гость






Закомпилил. Выдает чепуху при вводе напрример 8 выдаст 6 6. Вы сами компилили?
 К началу страницы 
+ Ответить 
Гость_Caries
сообщение 16.12.2004 17:44
Сообщение #15


Гость






Может я просто неграмотно описал то что требуется? сейчас выводит просто числа в ряд 6 , 28,
Требуется чтобы выводилось так
6=1+2+3
28=1+2+4+7+14 и тд.
 К началу страницы 
+ Ответить 
FreeMan
сообщение 16.12.2004 17:58
Сообщение #16


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


замени
while s<>0 do begin
writeln(s mod 10, '  ');
s:=s div 10;
end;

на
while s<>1 do begin
for i:=1 to s do if s mod i=0 then begin
write(i,'  ');
s:=s div i;
end;
end;


Цитата
Закомпилил. Выдает чепуху при вводе напрример 8 выдаст 6 6. Вы сами компилили?

Я код не проверяю... Но в данном случае сработала, как задумано, просто я не понял вопрос.
З.Ы. Можно на "ты"


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 16.12.2004 18:07
Сообщение #17


Гость






Млин. При 6 все нормально выдает 1 2 3
если вводим 9 то выдаст 1 2 3 1 7 1 2
 К началу страницы 
+ Ответить 
volvo
сообщение 16.12.2004 19:09
Сообщение #18


Гость






Guest
Попробуй вот так:

Program semestr;
var i,n,s,z:Integer;
 elem_ix: integer;
 elem: array[1 .. 200] of integer;
begin
 writeln('DANNAJA PROGRAMMA HAXODIT COBEPSHEHHIE CHISLA');
 WRITELN('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^');

 write('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;

 elem_ix := 0;
 for i:=2 to (z div 2) do
 begin
   if (z mod i) = 0 then
     begin
       inc(s,i);
       inc(elem_ix); elem[elem_ix] := i;
     end;
 end;
   If s=z then begin
     write(z, ' = ');

     write('1+');
     for i := 1 to elem_ix do
       begin
         write(elem[i]);
         if i <> elem_ix then write('+')
       end;
     writeln
   end;
 {readln;}
 end;
end.

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 19:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"