Oberon space
General Category => Общий раздел => Тема начата: valexey от Июль 27, 2012, 03:03:58 pm
-
Давненько у нас задачек интересных не было.
Итак, дана java. И даны два числа (double). Необходимо написать функцию которая пользуясь только арифметическими действиями (без логических операций, без ветвлений и так далее) вернет 0.0 если a < b, и 1.0 если a>=b. Можно считать что a>0 и b>0.
То есть написать функцию double compare(double a, double b);
В функции не должно быть приведений типов, нельзя использовать тернарный оператор (?:) и так далее. Все что там должно быть - return с выражением.
Какие именно арифметические операторы/функции можно использовать:
+ Additive operator (also used
for String concatenation)
- Subtraction operator
* Multiplication operator
/ Division operator
% Remainder operator
double pow(double a, double b) // Returns the value of the first argument raised to the power of the second argument.
Замечу для прожженых сишников - в java оператор взятия остатка от деления (%) РАЗРЕШЕН для плавающей точки (double/float). Это не привычно, но это так.
И нет, в решении не обязательно использовать ВСЕ операторы/функции разрешенные. Эта задача не синтетическая, это реальная задача с производства (тамошний интерпретатор формул умеет ровно это, потому и такой набор операций).
И да, задача имеет решение.
-
округлить до ближайшего целого a / (a + b)
-
округлить до ближайшего целого a / (a + b)
и как ты это сделаешь? Все что у нас есть, я перечислил.
-
хм... без округления не знаю как...
-
Пусть
r1=(a - a % b)/b и r2=(b - b % a)/a - неполные частные от a/b и b/a
тогда искомая формула r1/(r1+r2)+r1*r2/2
-
А что здесь коварного Алексей?
-
Пусть
r1=(a - a % b)/b и r2=(b - b % a)/a - неполные частные от a/b и b/a
тогда искомая формула r1/(r1+r2)+r1*r2/2
Браво!
Хотя есть конечно и другое решение, в чем то не такое красивое.
-
Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
-
тамошний интерпретатор формул умеет ровно это, потому и такой набор операций
Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...
-
Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...
;) я -вполне, это что -то вроде продвинутого калькулятора -точнее, это интерпретатор формул... лет 20 назад выпускались даже реальные инженерные формульные калькуляторы (редкие в совке).
-
Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
1-Math.pow(0,a-a%b)
-
:D Да, действительно, коварная...
-
Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
1-Math.pow(0,a-a%b)
Кстати, с целыми числами тоже работает:
Prelude> let foo a b = 1-(0^(a-(a`mod`b)))
Prelude> :t foo
foo :: (Integral b, Num a) => b -> b -> a
Prelude> foo 10 20
0
Prelude> foo 20 10
1