Oberon space

General Category => Общий раздел => Тема начата: valexey от Июль 27, 2012, 03:03:58 pm

Название: Задачка коварная.
Отправлено: 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). Это не привычно, но это так.

И нет, в решении не обязательно использовать ВСЕ операторы/функции разрешенные. Эта задача не синтетическая, это реальная задача с производства (тамошний интерпретатор формул умеет ровно это, потому и такой набор операций).

И да, задача имеет решение.
Название: Re: Задачка коварная.
Отправлено: ilovb от Июль 27, 2012, 03:33:22 pm
округлить до ближайшего целого a / (a + b)
Название: Re: Задачка коварная.
Отправлено: valexey от Июль 27, 2012, 03:36:36 pm
округлить до ближайшего целого a / (a + b)
и как ты это сделаешь? Все что у нас есть, я перечислил.
Название: Re: Задачка коварная.
Отправлено: ilovb от Июль 27, 2012, 03:47:25 pm
хм... без округления не знаю как...
Название: Re: Задачка коварная.
Отправлено: DIzer от Июль 27, 2012, 05:29:13 pm
Пусть
r1=(a - a % b)/b и r2=(b - b % a)/a - неполные частные от a/b и  b/a
тогда искомая формула r1/(r1+r2)+r1*r2/2
Название: Re: Задачка коварная.
Отправлено: DIzer от Июль 27, 2012, 05:34:17 pm
А что здесь коварного Алексей?
Название: Re: Задачка коварная.
Отправлено: valexey от Июль 27, 2012, 05:49:25 pm
Пусть
r1=(a - a % b)/b и r2=(b - b % a)/a - неполные частные от a/b и  b/a
тогда искомая формула r1/(r1+r2)+r1*r2/2
Браво!

Хотя есть конечно и другое решение, в чем то не такое красивое.
Название: Re: Задачка коварная.
Отправлено: DIzer от Август 01, 2012, 03:59:08 pm

Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
Название: Re: Задачка коварная.
Отправлено: ilovb от Август 01, 2012, 05:36:37 pm
тамошний интерпретатор формул умеет ровно это, потому и такой набор операций

Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...
Название: Re: Задачка коварная.
Отправлено: DIzer от Август 02, 2012, 08:26:34 am

Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...
;) я -вполне, это что -то вроде  продвинутого калькулятора -точнее, это интерпретатор  формул... лет 20 назад выпускались даже реальные инженерные формульные калькуляторы (редкие в совке).
Название: Re: Задачка коварная.
Отправлено: valexey от Август 02, 2012, 11:10:23 am

Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
1-Math.pow(0,a-a%b)
Название: Re: Задачка коварная.
Отправлено: DIzer от Август 02, 2012, 11:39:18 am
 :D Да, действительно, коварная...
Название: Re: Задачка коварная.
Отправлено: Geniepro от Июль 17, 2013, 05:43:58 am

Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
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