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

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

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

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


Новичок
*

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

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


Нужон хелп. Никак не могу добиться, чтобы лишний раз цикл не прокручивался.
Задача.Дано целое число N (> 1). Вывести наибольшее целое K, при котором выполняется неравенство 3^K < N, и само значение 3^K. 

Program j;
uses Crt;
var
b, n, k:integer;
begin
ClrScr;
write('Введите n='); readln(n);
b:=1; k:=0;
repeat
k:=k+1;
b:=b*3;
until b>n;
writeln('k=', k, ' 3^k=', b);
readln;
end.

С while тоже не получается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Цитата
С while тоже не получается.
Как раз с while получается:
   b:=1; k:=0;
while 3*b < n do
begin
k:=k+1;
b:=b*3;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Спасибо. Помогло.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Просто для полноты рассмотрения - с repeat/until тоже все прекрасно выходит:

  b:=1;
k:= -1;
repeat
Inc(k);
b:= b*3
until b>=n; { обрати внимание - тут нужно нестрогое неравенство! если, конечно, условие приведено верно.. }

Пусть автор темы не думает, что тут есть принципиальная разница.. ))

Но вообще, я не понимаю преподов, которые дают подобные задачи.. Заставлять студентов делать нерациональное решение - методологическая ошибка, я считаю. Задача решается без всяких циклов в одно касание:

  k:= Trunc(ln(N-1)/ln(3));


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Цитата
с repeat/until тоже все прекрасно выходит:
Ай-яй-яй smile.gif А как же проверка граничных случаев?

Цитата
Задача.Дано целое число N (> 1).
Ну вот я и возьму > 1. Двойку, к примеру. А мне твой цикл скажет, что тройка меньше двух? И вообще, что 30 = 3?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


Это не препод, это самообучение (решил, вот, заняться программированием, да и мозг покачать). А строку к:=-1 сам хотел вставить, но мне показалось, что это попахивает подгонкой результата.
Обратил внимание когда вы ответы публикуете. Реально в 4 или в 5 утра?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(IUnknown @ 23.03.2012 5:47) *
Ай-яй-яй smile.gif А как же проверка граничных случаев?
Если честно, не делал ее тут. Виноват )).

Цитата
Ну вот я и возьму > 1. Двойку, к примеру. А мне твой цикл скажет, что тройка меньше двух? И вообще, что 30 = 3?
Володь, я не совсем понимаю, о чем ты.. При чем тут 3<2?
Для простоты, я приведу код, который я использовал, один в один:
var
n,k,b: longint;

begin
readln(n);
b:=1;
k:= -1;
repeat
Inc(k);
b:= b*3
until b>=n;
//k:= Trunc(ln(N-1)/ln(3));
writeln('k = ',k,' 3^k = ',Round(exp(ln(3)*k)));
readln
end.

И еще заодно ее выдачу:
Running "c:\_\dropbox\pas\fp\fp120322_bars\fp120322_bars_lapp.exe "
4
k = 1 3^k = 3

Running "c:\_\dropbox\pas\fp\fp120322_bars\fp120322_bars_lapp.exe "
3
k = 0 3^k = 1

Running "c:\_\dropbox\pas\fp\fp120322_bars\fp120322_bars_lapp.exe "
2
k = 0 3^k = 1

Running "c:\_\dropbox\pas\fp\fp120322_bars\fp120322_bars_lapp.exe "
1
k = 0 3^k = 1


Все вроде в порядке, включая n=2. На последний не обращай внимания, это так, за компанию )). Или я что-то не понимаю?..

Цитата(Барс @ 23.03.2012 9:31) *
Это не препод, это самообучение (решил, вот, заняться программированием, да и мозг покачать). А строку к:=-1 сам хотел вставить, но мне показалось, что это попахивает подгонкой результата.
Похвально, +1 ))
Подгонка - это не свойство программы. Это способ сдать задачу. Если ты понимаешь, что делаешь и почему - это не подгонка, а решение.

Цитата
Обратил внимание когда вы ответы публикуете. Реально в 4 или в 5 утра?
Нет, не реально ). У меня в этот момент 5-6 вечера, самое время отдохнуть от работы )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

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

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


Цитата(Lapp @ 23.03.2012 11:18) *


Подгонка - это не свойство программы. Это способ сдать задачу. Если ты понимаешь, что делаешь и почему - это не подгонка, а решение.

Просто помню со школы, нам за это балл снижали. Считалось, что некорректно так делать.



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


Злостный любитель
*****

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

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


> Вывести наибольшее целое K, при котором выполняется неравенство 3^K < N, и само значение 3^K.


case N of
0..3-1 : K := 0;
3..3*3-1 : K := 1;
3*3..3*3*3-1 : K := 2;
3*3*3..3*3*3*3-1 : K := 3;
3*3*3*3..3*3*3*3*3-1 : K := 4;
3*3*3*3*3..3*3*3*3*3*3-1 : K := 5;
3*3*3*3*3*3..3*3*3*3*3*3*3-1 : K := 6;
3*3*3*3*3*3*3..3*3*3*3*3*3*3*3-1 : K := 7;
3*3*3*3*3*3*3*3..3*3*3*3*3*3*3*3*3-1 : K := 8;
3*3*3*3*3*3*3*3*3..3*3*3*3*3*3*3*3*3*3-1 : K := 9;
end;


Работает для чисел до 65536, для турбопаскаля сгодится.
Зато без вещественной математики!


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


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Барс @ 23.03.2012 11:47) *
Просто помню со школы, нам за это балл снижали. Считалось, что некорректно так делать.
За что "это"?
Я все равно не могу взять в толк.. Чем 0 лучше, чем -1? blink.gif
Барс, я не поленюсь повторить: если ты понимаешь, чем вызвана необходимость сделать именно так, и уверен в правильности алгоритма для всего диапазона входных данных, то это не подгонка, а решение. Либо твой препод был неправ, либо он не совсем то имел в виду, как ты толкуешь. Инициализация значением -1 тут необходима, поскольку обязательно есть хотя бы один проход тела цикла. Если ты знаешь, что впереди опасный поворот, и заранее сбрасываешь скорость - это неправильно? надо каждый раз кувыркаться в кювет только потому, что реагировать надо только на то, что видишь? smile.gif

Постарайся вникнуть. Не надо догм, нужна логика мышления.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

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

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


За "это" - это за присвоение начальным значениям (сумме, счётчику и т.д.) -1. А необходимость к:=-1 я понимал, просто школьная память помешала. Кстати, школу я закончил давненько, может это раньше преподы так требовали, а теперь иначе. Теперь не буду на это внимание обращать, буду делать как подсказывает логика.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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