Люди у меня есть задача и даже прогу, которая решает эту задачу я написал но она(прога) не тработает. ПЛЗ. пораскиньте, кто чем может. ---------------------------------------------- Задача даны числа k, l, m, выяснить, можно ли любое число преобразовать в единицу за m раз следующим образом если число(n) чётно, то подельть его на два, если нет, то умножить его на три и прибавить единицу. ---------------------------------------------- Прога виснет при некоторых значениях к, l, m.(см diapazon.pas)
volvo
19.10.2005 1:38
art88,
Цитата
Прога виснет при некоторых значениях
покажи, при каких именно значениях у тебя виснет программа.
И заодно объясни, что такое K и L?
Atos
19.10.2005 9:13
Программа виснет, потому что строчка ok1:=false может не выполняться, и тогда цикл while (n <= l) and ok1 будет крутиться вечно.
art88
19.10.2005 21:13
Цитата(volvo @ 18.10.2005 21:38)
art88, покажи, при каких именно значениях у тебя виснет программа.
И заодно объясни, что такое K и L?
k и l задают интервал, в котором изменяется n прога не работает например при k=1 l=3 n=10
volvo
19.10.2005 21:28
У тебя же программа при этих значениях крутится с одинаковыми числами (бесконечный цикл). Вот так хотя бы сделай:
program diapazon;
var
k, l, m, n : integer;
ok1, ok2 : Boolean;
i, j : integer;
begin
writeln('...:::Diapazon:::...');
{ write('k='); readln(k);
write('l='); readln(l);
write('m='); readln(m); }
k := 1;
l := 3;
m := 10;
i:=0;
n:=k-1;
ok1:=true;
ok2:=false;
while (n <= l) and ok1 dobegin
n := k + 1; inc(k); { <-- Это кто будет делать? }{ Для проверки: }
writeln('k = ', k, ' n = ', n);
whilenot ok2 dobegin
inc(i);
if odd(n) then n := succ(3 * n)
else n := n div2;
ok2 := (n = 1);
end;
ok1 := (i <= m);
end;
if ok1 then writeln('yes ', i)
else writeln('no ', i);
readln;
end.
art88
22.10.2005 16:05
volovo, твой вариант программы работает не правильно, если мы вводим к=1, l=3 и m=6, то программа напишет 'yes 1' , хотя на самом деле число 3, преобразуется в единицу, указанным в задаче способом за семь раз (3, 10, 5, 16, 8, 4, 2, 1).
volvo
22.10.2005 16:14
art88, ты меня конечно извини, но это ТВОЙ вариант программы работает неправильно, я просто вывел его из "вечного цикла", ничего при этом не меняя в логике !!!
На самом деле, вот это:
i := 0; ok2 := false; { <-- Нужно делать именно здесь !!! }{ Перед самым циклом, а не где-то в другом месте. Тогда все работает... }whilenot ok2 dobegin
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.