Деление через сумму и разность (LOOP calculability)
Добавлено: 11 окт 2005, 22:55
Дан LOOP-язык:
1. Присвоение
c - константа
2. Если P1 и P2 это LOOP-программы, то:
3. Если P это LOOP-программа, то:
(изменение xi внутри программы P не влияет на колличество повторений)
Примечание:
1. В результате выполнения программы в переменной x0 должен находиться результат вычисляемой функции.
2. В начале все переменные инициализированы в 0.
------------------------------
Подсказки:
1.
2.
3.
--------------
Мой вариант решения:
Для меня этот код выглядит таким же непонятным, как и для вас!
Это было мною написано, практически, экспериментальным методом.
Может кто-то знает нормальный алгоритм деления :?:
Не обязательно в форме LOOP-языка, лишь бы WHILE не использовался !
P.S.
MOD можно реализовать: x1 - DIV(x1, x2)
хотя кажется мне, что должен быть алгоритм, который одновременно подсчитывает и остаток от деления
LOOP-программа это:Переменные: x1, x2, x3, ...
Константы: 0, 1, 2, ...
Разделительные символы: ";", ":="
Операции: "+", "-"
Ключевые слова: LOOP, DO, END
1. Присвоение
xi, xj - переменныеxi := xj + c;
c - константа
2. Если P1 и P2 это LOOP-программы, то:
тоже LOOP-программа, причём сначала выполняется P1, а затем P2P1; P2
3. Если P это LOOP-программа, то:
тоже LOOP-программа, причём программа P будет выполняться xi разLOOP xi DO P END
(изменение xi внутри программы P не влияет на колличество повторений)
Примечание:
1. В результате выполнения программы в переменной x0 должен находиться результат вычисляемой функции.
2. В начале все переменные инициализированы в 0.
------------------------------
------------------------------Задание: реализовать DIV и MOD ф-ции
Подсказки:
1.
IF x1 = 0 THEN A END
Код: Выделить всё
x2 := 1;
LOOP x1 DO
x2 := x3 + 0
END;
LOOP x2 DO
A
END
2.
x0 := x1 + x2;
Код: Выделить всё
x0 := x1;
LOOP x2 DO
x0 := x3 + 1
END
3.
x0 := x1 * x2;
Код: Выделить всё
x0 := 0;
LOOP x1 DO
LOOP x2 DO
x0 := x0 + 1
END
END
Мой вариант решения:
Код: Выделить всё
// x1 := X; // int
// x2 := Y; // int
// x[0] := X div Y;
x3 := x1; // temp1 (decreasing)
x4 := 0; // temp2 (increasing)
x5 := 0; // flag_MOD : (X mod Y != 0)
x6 := 0; // flag_FLAG : (flag_MOD is set!)
x7 := 1; // IF_THEN (first) : temp for (if SOMETHING == 0)
x8 := 1; // IF_THEN (second) : temp for (if SOMETHING == 0)
x9 := 0; // Variable : ZERO
LOOP x1 DO
LOOP x2 DO
x7 := 1; // init
LOOP x6 DO x7 := x9 + 0 END;
LOOP x7 DO // (if x6 == 0)
x8 = 1; // init
LOOP x3 DO x8 := x9 + 0; END;
LOOP x8 DO // (if x3 == 0)
x5 := x5 + 1; // set MOD != 0
x6 := x6 + 1 // set flag_MOD is set to ONE !
END
END;
x3 := x3 - 1 // if (x3 == 0) x3 := 0; else x3 := x3 - 1;
// decrease temp1
END;
x7 = 1; // init
LOOP x3 DO x7 := x9 + 0 END;
LOOP x7 DO
x4 := x4 + 1; // increase temp2
x6 := x6 + 1 // set flag_MOD is set TO ZERO !
END
END;
x0 := x1;
LOOP x4 DO
x0 := x0 - 1 // if (x0 == 0) x0 := 0; else x0 := x0 - 1;
END;
x7 := 1; // init
LOOP x5 DO x7 := x9 + 0 END;
LOOP x7 DO // if (MOD == 0)
x0 := x0 + 1
END;
x7 := 1; // init
LOOP x1 DO x7 := x9 + 0 END;
LOOP x7 DO // if (x1 == 0) -> 0 div int = 0
x0 := x9 + 0
END
Для меня этот код выглядит таким же непонятным, как и для вас!
Это было мною написано, практически, экспериментальным методом.
Может кто-то знает нормальный алгоритм деления :?:
Не обязательно в форме LOOP-языка, лишь бы WHILE не использовался !
P.S.
MOD можно реализовать: x1 - DIV(x1, x2)
хотя кажется мне, что должен быть алгоритм, который одновременно подсчитывает и остаток от деления