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