Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на цикл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Барс
Нужон хелп. Никак не могу добиться, чтобы лишний раз цикл не прокручивался.
Задача.Дано целое число 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
Цитата
С while тоже не получается.
Как раз с while получается:
   b:=1; k:=0;
   while 3*b < n do
   begin
      k:=k+1;
      b:=b*3;
   end;
Барс
Спасибо. Помогло.
Lapp
Просто для полноты рассмотрения - с repeat/until тоже все прекрасно выходит:

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

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

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

  k:= Trunc(ln(N-1)/ln(3));
IUnknown
Цитата
с repeat/until тоже все прекрасно выходит:
Ай-яй-яй smile.gif А как же проверка граничных случаев?

Цитата
Задача.Дано целое число N (> 1).
Ну вот я и возьму > 1. Двойку, к примеру. А мне твой цикл скажет, что тройка меньше двух? И вообще, что 30 = 3?
Барс
Это не препод, это самообучение (решил, вот, заняться программированием, да и мозг покачать). А строку к:=-1 сам хотел вставить, но мне показалось, что это попахивает подгонкой результата.
Обратил внимание когда вы ответы публикуете. Реально в 4 или в 5 утра?
Lapp
Цитата(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 вечера, самое время отдохнуть от работы )).
Барс
Цитата(Lapp @ 23.03.2012 11:18) *


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

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



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

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