Comments 72
a*a+b*b+1 всегда больше и a и b
abs(a+b) — abs(a-b)?
2 минуты.
a=-3, b=-6
abs(a+b)-abs(a-b) = abs(-3+(-6))-abs(-3-(-6)) = 6
abs(a+b)-abs(a-b) = abs(-3+(-6))-abs(-3-(-6)) = 6
abs() — по сути условный оператор, так что это не решение.
из java.lang.Math например:
из java.lang.Math например:
public static int abs(int a) {
return (a < 0) ? -a : a;
}
Не, ну сказано же, что задача математическая, а не по программированию.
Ну в определении модуля для вещественных чисел все равно фигурирует условие. Поэтому и написал «по сути».
Модуль тоже можно выразить простой математикой. Например:
int abs(int a) { return sqrt(a*a); }
int abs(int a) { return sqrt(a*a); }
Безусловно, вы правы. Но, на мой взгляд, когда пишут просто abs(a) подразумевают |a|.
abs(10+3) — abs(10-3) = 13 — 7 = 6. Не работает.
(a/b) * (a — b) + b
a * (a — b + |a — b|) / 2 + b * (b — a + |b — a|) / 2
((a-b)-|a-b|)/(2*(a-b))*b+((b-a)-|b-a|)/(2*(b-a))*a
Так как оба числа находятся на расстоянии полуразности от их среднего:
(a+b)/2 + abs(a-b)/2
среднее + абсолютная полуразность
(a+b)/2 + abs(a-b)/2
среднее + абсолютная полуразность
Вот это мое решение! :)
Опять-таки, не учитывает, что числа могут быть отрицательными. Но красиво :)
Отрицательные числа в данном случае учитываются. Это хорошее решение.
-3 и -4.
|-3-4|/2 + |-3+4|/2 = 7/2 + 1/2 = 4
Для этого примера решение не работает.
|-3-4|/2 + |-3+4|/2 = 7/2 + 1/2 = 4
Для этого примера решение не работает.
Но и в этом решении есть минус. Подставьте, например, -5 и 4.
Подставил. Получил правильный ответ: (-5+4)/2 + abs(-5-4)/2 = 4
На этом примере нормально:
(a+b)/2 + abs(a-b)/2 = (-5+4).2 + abs(-5-4)/2 = -0.5 + 4.5 = 4
(a+b)/2 + abs(a-b)/2 = (-5+4).2 + abs(-5-4)/2 = -0.5 + 4.5 = 4
Отлично, но я удивлен, что это не 1-5 комментарий.
Молодеет Хабр.
Молодеет Хабр.
Всмысле, — удивлены? Я решил эту задачу позавчера, просто было бы глупо сразу ответ в топике написать :)
Кстати, можно записать так
((a+b) + abs(a-b))/2
((a+b) + abs(a-b))/2
Так-с, удалось избавиться от модуля. Вот программерское решение для 32-разрядных чисел:
a — ((a — b) >> 31) * (a — b)
a — ((a — b) >> 31) * (a — b)
a=-5
b=4
Ответ: 36
ЧЯДНТ?
b=4
Ответ: 36
ЧЯДНТ?
Я не знаю, каким образом Вы получили 36. На данном примере должно быть так:
Ответ правильный.
a - ((a - b) >> 31) * (a - b) = -5 - ((-5 - 4) >> 31) * (-5 - 4) = -5 - (-9 >> 31) * -9 =-5 - -9 = 4
Ответ правильный.
Извините, ответил ниже:
-5 — (-9 >> 31) * -9 = -5 — (-1) * -9 = -14
-5 — (-9 >> 31) * -9 = -5 — (-1) * -9 = -14
Я тоже обсчитался — ответ не 36, а -14.
-9 >> 31 = 1, а Вы почему-то получили -1
Это -1. Проверьте в вашем любимом компиляторе.
Точно, я забыл сделать & 1. Тогда вот новое решение, без этого недостатка:
a - (((a - b) >> 31) & 1) * (a - b)
Кстати, интересно. Я только что проверил -9 >> 31 на разных компиляторах:
C: -1
PHP: -1
Perl: 1 (только тут я делал -9 >> 63, так как используются 64 разрядные числа)
Данный код на Perl вернул правильный результат: 4.
Но в любом случае, конечно, вариант с &1 использовать предпочтительнее, так как он более универсален.
C: -1
PHP: -1
Perl: 1 (только тут я делал -9 >> 63, так как используются 64 разрядные числа)
my $a = -5;
my $b = 4;
print $a - (($a - $b) >> 63) * ($a - $b);
Данный код на Perl вернул правильный результат: 4.
Но в любом случае, конечно, вариант с &1 использовать предпочтительнее, так как он более универсален.
-5 — (-9 >> 31) * -9 = -5 — (-1) * -9 = -14
Наверное не по правилам, но
return last_value(sort(array(a,b)));
return last_value(sort(array(a,b)));
Решение на плюсах без сравнения и условий:
char getMax(char a, char b)
{
char m[2];
m[0]=b;
m[1]=a;
a-=b;
return m[(a>>8)+1];
}
Не заглядывая в комментарии: a*(1 + (a-b)/|a-b|)/2 + b*(1 + (b-a)/|b-a|)/2
Sign up to leave a comment.
Найти большее значение без сравнения и условий