Нужон хелп. Никак не могу добиться, чтобы лишний раз цикл не прокручивался.
Задача.Дано целое число 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 тоже не получается.
IUnknown
22.03.2012 17:24
Цитата
С while тоже не получается.
Как раз с while получается:
b:=1; k:=0;
while3*b < n dobegin
k:=k+1;
b:=b*3;
end;
Барс
22.03.2012 17:53
Спасибо. Помогло.
Lapp
23.03.2012 8:20
Просто для полноты рассмотрения - с repeat/until тоже все прекрасно выходит:
b:=1;
k:= -1;
repeat
Inc(k);
b:= b*3until b>=n; { обрати внимание - тут нужно нестрогое неравенство! если, конечно, условие приведено верно.. }
Пусть автор темы не думает, что тут есть принципиальная разница.. ))
Но вообще, я не понимаю преподов, которые дают подобные задачи.. Заставлять студентов делать нерациональное решение - методологическая ошибка, я считаю. Задача решается без всяких циклов в одно касание:
k:= Trunc(ln(N-1)/ln(3));
IUnknown
23.03.2012 8:47
Цитата
с repeat/until тоже все прекрасно выходит:
Ай-яй-яй А как же проверка граничных случаев?
Цитата
Задача.Дано целое число N (> 1).
Ну вот я и возьму > 1. Двойку, к примеру. А мне твой цикл скажет, что тройка меньше двух? И вообще, что 30 = 3?
Барс
23.03.2012 12:31
Это не препод, это самообучение (решил, вот, заняться программированием, да и мозг покачать). А строку к:=-1 сам хотел вставить, но мне показалось, что это попахивает подгонкой результата. Обратил внимание когда вы ответы публикуете. Реально в 4 или в 5 утра?
Lapp
23.03.2012 14:18
Цитата(IUnknown @ 23.03.2012 5:47)
Ай-яй-яй А как же проверка граничных случаев?
Если честно, не делал ее тут. Виноват )).
Цитата
Ну вот я и возьму > 1. Двойку, к примеру. А мне твой цикл скажет, что тройка меньше двух? И вообще, что 30 = 3?
Володь, я не совсем понимаю, о чем ты.. При чем тут 3<2? Для простоты, я приведу код, который я использовал, один в один:
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 вечера, самое время отдохнуть от работы )).
Барс
23.03.2012 14:47
Цитата(Lapp @ 23.03.2012 11:18)
Подгонка - это не свойство программы. Это способ сдать задачу. Если ты понимаешь, что делаешь и почему - это не подгонка, а решение.
Просто помню со школы, нам за это балл снижали. Считалось, что некорректно так делать.
TarasBer
23.03.2012 15:57
> Вывести наибольшее целое K, при котором выполняется неравенство 3^K < N, и само значение 3^K.
case N of0..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, для турбопаскаля сгодится. Зато без вещественной математики!
Lapp
24.03.2012 11:50
Цитата(Барс @ 23.03.2012 11:47)
Просто помню со школы, нам за это балл снижали. Считалось, что некорректно так делать.
За что "это"? Я все равно не могу взять в толк.. Чем 0 лучше, чем -1? Барс, я не поленюсь повторить: если ты понимаешь, чем вызвана необходимость сделать именно так, и уверен в правильности алгоритма для всего диапазона входных данных, то это не подгонка, а решение. Либо твой препод был неправ, либо он не совсем то имел в виду, как ты толкуешь. Инициализация значением -1 тут необходима, поскольку обязательно есть хотя бы один проход тела цикла. Если ты знаешь, что впереди опасный поворот, и заранее сбрасываешь скорость - это неправильно? надо каждый раз кувыркаться в кювет только потому, что реагировать надо только на то, что видишь?
Постарайся вникнуть. Не надо догм, нужна логика мышления.
Барс
26.03.2012 16:07
За "это" - это за присвоение начальным значениям (сумме, счётчику и т.д.) -1. А необходимость к:=-1 я понимал, просто школьная память помешала. Кстати, школу я закончил давненько, может это раньше преподы так требовали, а теперь иначе. Теперь не буду на это внимание обращать, буду делать как подсказывает логика.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.