1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Вот написал программу для нахождения 4 совершенных чисел на отрезке, но почему то когда ввожу 1000 то происходит зацикливание (возможно и в других случаях просто не проверял больше)
Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
While k<>4doBeginFor i:=2to n doBegin
s:=0;
For j:=1to n doif (i mod j = 0)and(i<>j) then s:=s+j;
if s=i thenbegin writeln('Совершенное число = ',i);k:=k+1;end;
end;
end;
readln;
End.
А что, K при каких-то условиях станет равно 4, чтобы выйти из цикла? Не станет, в интервале 2 .. 1000 всего 3 совершенных числа. Вот цикл и будет крутиться вечно, в попытках найти четвертое, несуществующее... Зачем тебе вообще цикл While - непонятно. Убери его.
P.S. Этот алгоритм поиска совершенных чисел подходит только для небольших интервалов. Чем интервал шире - тем дольше будет осуществляться поиск. Тогда совершенные числа стоит искать вот так
А что, K при каких-то условиях станет равно 4, чтобы выйти из цикла? Не станет, в интервале 2 .. 1000 всего 3 совершенных числа. Вот цикл и будет крутиться вечно, в попытках найти четвертое, несуществующее... Зачем тебе вообще цикл While - непонятно. Убери его.
P.S. Этот алгоритм поиска совершенных чисел подходит только для небольших интервалов. Чем интервал шире - тем дольше будет осуществляться поиск. Тогда совершенные числа стоит искать вот так
В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...так без него конечно корректнее всё было бы...
Добавлено через 3 мин. Спасибо терь всё понятно стало почему зацикливается)))пусть так и будет раз ему так надо)))Спасибо)))
> В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...
Ты его не туда поставил. У тебя сначала перебираются ВСЕ числа до эн, а потом проверяется счётчик. А надо проверять его постоянно:
For i:=2to n doBegin
s:=0;
For j:=1to n doif (i mod j = 0)and(i<>j) then s:=s+j;
if s=i thenbegin
writeln('Совершенное число = ',i);
k:=k+1;
if k>=4then Break; // достигли порога - выходим из цикла
end;
end;
> В том то и дело что мне преподаватель сказал ввести счётчик чтобы заканчивался когда 4 совершенных найдёт...
Ты его не туда поставил. У тебя сначала перебираются ВСЕ числа до эн, а потом проверяется счётчик. А надо проверять его постоянно:
For i:=2to n doBegin
s:=0;
For j:=1to n doif (i mod j = 0)and(i<>j) then s:=s+j;
if s=i thenbegin
writeln('Совершенное число = ',i);
k:=k+1;
if k>=4then Break; // достигли порога - выходим из цикла
end;
end;
Спасибо но я замутил вот так
Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
While k<4doBeginFor i:=2to n doBegin
s:=0;
For j:=1to n doif (i mod j = 0)and(i<>j) then s:=s+j;
if (s=i)and(k<4) thenbegin writeln('Совершенное число = ',i);k:=k+1;end;
end;
end;
readln;
End.
Фигню ты замутил. Зависон на случай, если чисел до эн меньше 4, никуда не делся.
никого зависона если что опять же идёт по новому проверка и выдаёт те же совершенные числа что и нашёл до этого....лучше всматриваться в прогу надо было)
никого зависона если что опять же идёт по новому проверка и выдаёт те же совершенные числа что и нашёл до этого....лучше всматриваться в прогу надо было)
А, ну да, извини. Но он выводит те же числа снова, ты считаешь это корректным? Это в любом случае ты написал неверный алгоритм.
> да он станет верным тогда когда уберешь ограничение в 4 а просто вывод того сколько в диапозоне :-)
Твой код не подходит под техзадание. Отмазы типа "оно будет верным под другое ТЗ" никому не интересны.
ну если подумать то как он подойдет если например я введу число n равное 100 то там всего 2 совершенных числа то как тогда должна программа найти еще 2?
если например я введу число n равное 100 то там всего 2 совершенных числа то как тогда должна программа найти еще 2?
Да не должна она искать еще 2... Программа должна вывести МАКСИМУМ 4 совершенных числа (если четырех нет - то вывести ровно столько, сколько есть), а не из любого интервала высасывать 4 штуки, даже если их там совсем нет. Для интереса попробуй ввести n = 5, посмотрим, откуда тогда твой код найдет 4 совершенных числа.
Да не должна она искать еще 2... Программа должна вывести МАКСИМУМ 4 совершенных числа (если четырех нет - то вывести ровно столько, сколько есть), а не из любого интервала высасывать 4 штуки, даже если их там совсем нет. Для интереса попробуй ввести n = 5, посмотрим, откуда тогда твой код найдет 4 совершенных числа.
Ну если только так то тогда будет вот так
Program sovershenie;
Var n,i,k,j,s:longint;
Begin
write('Введите n= ');readln(n);
For i:=2to n doBegin
s:=0;
For j:=1to n doif (i mod j = 0)and(i<>j) then s:=s+j;
if (s=i) thenbegin writeln('Совершенное число = ',i);k:=k+1;end;
if k>=4then break;
end;
if k=0then writeln('Совершенных чисел нету в данном диапозоне');
readln;
End.