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

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

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

 
 Ответить  Открыть новую тему 
> Задача на цикл
Барс
сообщение 22.03.2012 12:42
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 22.03.2012 13:24
Сообщение #2


a.k.a. volvo877
*****

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

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


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


Новичок
*

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

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


Спасибо. Помогло.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.03.2012 4:20
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 23.03.2012 4:47
Сообщение #5


a.k.a. volvo877
*****

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

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


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

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


Новичок
*

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

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


Это не препод, это самообучение (решил, вот, заняться программированием, да и мозг покачать). А строку к:=-1 сам хотел вставить, но мне показалось, что это попахивает подгонкой результата.
Обратил внимание когда вы ответы публикуете. Реально в 4 или в 5 утра?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.03.2012 10:18
Сообщение #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 
 К началу страницы 
+ Ответить 
Барс
сообщение 23.03.2012 10:47
Сообщение #8


Новичок
*

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

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


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


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

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



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 23.03.2012 11:57
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.03.2012 7:50
Сообщение #10


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

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

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


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

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


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


Новичок
*

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

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


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

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

 



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