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

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

Форум «Всё о Паскале» _ Задачи _ Зацикливание

Автор: Artem7 16.03.2012 16:13

Вот написал программу для нахождения 4 совершенных чисел на отрезке, но почему то когда ввожу 1000 то происходит зацикливание (возможно и в других случаях просто не проверял больше)

Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
While k<>4 do
Begin
For i:=2 to n do
Begin
s:=0;
For j:=1 to n do
if (i mod j = 0)and(i<>j) then s:=s+j;
if s=i then begin writeln('Совершенное число = ',i);k:=k+1;end;
end;
end;
readln;
End.

Автор: IUnknown 16.03.2012 16:33

А что, K при каких-то условиях станет равно 4, чтобы выйти из цикла? Не станет, в интервале 2 .. 1000 всего 3 совершенных числа. Вот цикл и будет крутиться вечно, в попытках найти четвертое, несуществующее... Зачем тебе вообще цикл While - непонятно. Убери его.

P.S. Этот алгоритм поиска совершенных чисел подходит только для небольших интервалов. Чем интервал шире - тем дольше будет осуществляться поиск. Тогда http://volvo71.narod.ru/faq_folder/numbers.htm#num_sover

Автор: Artem7 16.03.2012 16:37

Цитата(IUnknown @ 16.03.2012 12:33) *

А что, K при каких-то условиях станет равно 4, чтобы выйти из цикла? Не станет, в интервале 2 .. 1000 всего 3 совершенных числа. Вот цикл и будет крутиться вечно, в попытках найти четвертое, несуществующее... Зачем тебе вообще цикл While - непонятно. Убери его.

P.S. Этот алгоритм поиска совершенных чисел подходит только для небольших интервалов. Чем интервал шире - тем дольше будет осуществляться поиск. Тогда http://volvo71.narod.ru/faq_folder/numbers.htm#num_sover

В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...так без него конечно корректнее всё было бы...

Добавлено через 3 мин.
Спасибо терь всё понятно стало почему зацикливается)))пусть так и будет раз ему так надо)))Спасибо)))

Автор: TarasBer 16.03.2012 17:35

> В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...

Ты его не туда поставил. У тебя сначала перебираются ВСЕ числа до эн, а потом проверяется счётчик. А надо проверять его постоянно:


For i:=2 to n do
Begin
s:=0;
For j:=1 to n do
if (i mod j = 0)and(i<>j) then s:=s+j;
if s=i then begin
writeln('Совершенное число = ',i);
k:=k+1;
if k>=4 then Break; // достигли порога - выходим из цикла
end;
end;


Автор: Artem7 17.03.2012 10:38

Цитата(TarasBer @ 16.03.2012 13:35) *

> В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...

Ты его не туда поставил. У тебя сначала перебираются ВСЕ числа до эн, а потом проверяется счётчик. А надо проверять его постоянно:

For i:=2 to n do
Begin
s:=0;
For j:=1 to n do
if (i mod j = 0)and(i<>j) then s:=s+j;
if s=i then begin
writeln('Совершенное число = ',i);
k:=k+1;
if k>=4 then Break; // достигли порога - выходим из цикла
end;
end;



Спасибо но я замутил вот так
Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
While k<4 do
Begin
For i:=2 to n do
Begin
s:=0;
For j:=1 to n do
if (i mod j = 0)and(i<>j) then s:=s+j;
if (s=i)and(k<4) then begin writeln('Совершенное число = ',i);k:=k+1;end;
end;
end;
readln;
End.


Автор: TarasBer 17.03.2012 16:14

> Спасибо но я замутил вот так

Фигню ты замутил. Зависон на случай, если чисел до эн меньше 4, никуда не делся.

Автор: Artem7 17.03.2012 17:33

Цитата(TarasBer @ 17.03.2012 12:14) *

> Спасибо но я замутил вот так

Фигню ты замутил. Зависон на случай, если чисел до эн меньше 4, никуда не делся.

никого зависона если что опять же идёт по новому проверка и выдаёт те же совершенные числа что и нашёл до этого....лучше всматриваться в прогу надо было)

Автор: TarasBer 17.03.2012 20:03

Цитата(Artem7 @ 17.03.2012 13:33) *

никого зависона если что опять же идёт по новому проверка и выдаёт те же совершенные числа что и нашёл до этого....лучше всматриваться в прогу надо было)

А, ну да, извини. Но он выводит те же числа снова, ты считаешь это корректным?
Это в любом случае ты написал неверный алгоритм.

Автор: Artеm 17.03.2012 21:05

да он станет верным тогда когда уберешь ограничение в 4 а просто вывод того сколько в диапозоне :-)

Автор: TarasBer 17.03.2012 21:37

> да он станет верным тогда когда уберешь ограничение в 4 а просто вывод того сколько в диапозоне :-)

Твой код не подходит под техзадание. Отмазы типа "оно будет верным под другое ТЗ" никому не интересны.

Автор: Artеm 17.03.2012 23:02

Цитата(TarasBer @ 17.03.2012 17:37) *

> да он станет верным тогда когда уберешь ограничение в 4 а просто вывод того сколько в диапозоне :-)

Твой код не подходит под техзадание. Отмазы типа "оно будет верным под другое ТЗ" никому не интересны.

ну если подумать то как он подойдет если например я введу число n равное 100 то там всего 2 совершенных числа то как тогда должна программа найти еще 2?

Автор: IUnknown 18.03.2012 16:25

Цитата
если например я введу число n равное 100 то там всего 2 совершенных числа то как тогда должна программа найти еще 2?
Да не должна она искать еще 2... Программа должна вывести МАКСИМУМ 4 совершенных числа (если четырех нет - то вывести ровно столько, сколько есть), а не из любого интервала высасывать 4 штуки, даже если их там совсем нет. Для интереса попробуй ввести n = 5, посмотрим, откуда тогда твой код найдет 4 совершенных числа.

Автор: Artem7 18.03.2012 16:52

Цитата(IUnknown @ 18.03.2012 12:25) *

Да не должна она искать еще 2... Программа должна вывести МАКСИМУМ 4 совершенных числа (если четырех нет - то вывести ровно столько, сколько есть), а не из любого интервала высасывать 4 штуки, даже если их там совсем нет. Для интереса попробуй ввести n = 5, посмотрим, откуда тогда твой код найдет 4 совершенных числа.

Ну если только так то тогда будет вот так
Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
For i:=2 to n do
Begin
s:=0;
For j:=1 to n do
if (i mod j = 0)and(i<>j) then s:=s+j;
if (s=i) then begin writeln('Совершенное число = ',i);k:=k+1;end;
if k>=4 then break;
end;
if k=0 then writeln('Совершенных чисел нету в данном диапозоне');
readln;
End.


Автор: TarasBer 18.03.2012 17:44

Во, теперь верно написал.

Автор: Artem7 18.03.2012 17:51

Спасибо всем за помощь)))просто не правильно понял постановку задачи)))