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

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

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

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


Гость






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

Определить, является ли заданное натуральное число совершенным, т.е. Равным сумме всех своих (положительных) делителей, кроме самого этого числа (напр. Число 6 совершенно: 6=1+2+3).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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). Может, имеет смысл проверять напрямую?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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


Новичок
*

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

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


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

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


Бывалый
***

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

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


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

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

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


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


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

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

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


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


smile.gif


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


Новичок
*

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

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


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


-
****

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

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


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


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


Гость






Можно поподробнее?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






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


Гость






Может я просто неграмотно описал то что требуется? сейчас выводит просто числа в ряд 6 , 28,
Требуется чтобы выводилось так
6=1+2+3
28=1+2+4+7+14 и тд.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Млин. При 6 все нормально выдает 1 2 3
если вводим 9 то выдаст 1 2 3 1 7 1 2
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 23.12.2024 19:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name