Автор Тема: Задачка коварная.  (Прочитано 6700 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Задачка коварная.
« : Июль 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). Это не привычно, но это так.

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

И да, задача имеет решение.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка коварная.
« Ответ #1 : Июль 27, 2012, 03:33:22 pm »
округлить до ближайшего целого a / (a + b)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Задачка коварная.
« Ответ #2 : Июль 27, 2012, 03:36:36 pm »
округлить до ближайшего целого a / (a + b)
и как ты это сделаешь? Все что у нас есть, я перечислил.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка коварная.
« Ответ #3 : Июль 27, 2012, 03:47:25 pm »
хм... без округления не знаю как...

DIzer

  • Гость
Re: Задачка коварная.
« Ответ #4 : Июль 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

DIzer

  • Гость
Re: Задачка коварная.
« Ответ #5 : Июль 27, 2012, 05:34:17 pm »
А что здесь коварного Алексей?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Задачка коварная.
« Ответ #6 : Июль 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
Браво!

Хотя есть конечно и другое решение, в чем то не такое красивое.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Задачка коварная.
« Ответ #7 : Август 01, 2012, 03:59:08 pm »

Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка коварная.
« Ответ #8 : Август 01, 2012, 05:36:37 pm »
тамошний интерпретатор формул умеет ровно это, потому и такой набор операций

Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...

DIzer

  • Гость
Re: Задачка коварная.
« Ответ #9 : Август 02, 2012, 08:26:34 am »

Меня все вопрос мучает: А почему такой примитивный интерпретатор? Я себе что-то не могу представить вычисления без округления...
;) я -вполне, это что -то вроде  продвинутого калькулятора -точнее, это интерпретатор  формул... лет 20 назад выпускались даже реальные инженерные формульные калькуляторы (редкие в совке).

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Задачка коварная.
« Ответ #10 : Август 02, 2012, 11:10:23 am »

Хотя есть конечно и другое решение, в чем то не такое красивое.
Заинтересовали, однако, - в студию его!
1-Math.pow(0,a-a%b)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Задачка коварная.
« Ответ #11 : Август 02, 2012, 11:39:18 am »
 :D Да, действительно, коварная...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Задачка коварная.
« Ответ #12 : Июль 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
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…