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