powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / максимум без if
25 сообщений из 98, страница 1 из 4
максимум без if
    #38812430
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
напомните, есть ли алгоритм вычисления максимума из двух чисел без if
...
Рейтинг: 0 / 0
максимум без if
    #38812434
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ - * / and or xor
...
Рейтинг: 0 / 0
максимум без if
    #38812455
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придумать-то можно, но зачем?

Псевдокод:
Код: sql
1.
2.
3.
4.
5.
6.
int max(int a, int b)
(
  t[0]=a;
  t[1]=b;
  return a[sign(sign(b-a)+1)];
}

sign можно реализовать без if, например, сдвигами и бинарными операциями.
...
Рейтинг: 0 / 0
максимум без if
    #38812456
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка:
Код: sql
1.
2.
3.
4.
5.
6.
int max(int a, int b)
(
  t[0]=a;
  t[1]=b;
  return t[sign(sign(b-a)+1)];
}
...
Рейтинг: 0 / 0
максимум без if
    #38812457
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
c = a<b ? b : a;


Код: plaintext
1.
c = max(a,b);


Код: plaintext
1.
2.
3.
4.
5.
6.
c=0;
while(a>0 && b>0) {
    c++;
    a--;
    b--;
}



Ну а если Си не любишь, то можно и на SQL сделать.
Код: sql
1.
select @c = case when @a<@b then @b else @a end


Код: sql
1.
select @c = max(v) from (select v=a union select b) t
...
Рейтинг: 0 / 0
максимум без if
    #38812458
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Код: sql
1.
case when

Да, это не if, там и буковок-то таких нету!
...
Рейтинг: 0 / 0
максимум без if
    #38812518
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxнапомните, есть ли алгоритм вычисления максимума из двух чисел без if
А на брейнфаке генератор случайных чисел слабо?
...
Рейтинг: 0 / 0
максимум без if
    #38812531
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaytonsFuckenMaximumFunction.lisp
Код: python
1.
2.
(defun maximum(x y) 
  (cond ((= x y) x) ((> x y) x) ((< x y) y)))
...
Рейтинг: 0 / 0
максимум без if
    #38812585
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(a + b + abs(a-b)) / 2
...
Рейтинг: 0 / 0
максимум без if
    #38812605
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле все предложенные алгоритмы содержат неявный if. Если вы видите знак больше или меньше, то мы уже говорим о каком-либо условии. Казалось бы вариант предложенный Яростным мечом подходит, но и это не так. Ибо вычисление модуля подразумевает условие, кроме того, модуль не был в числе допустимых операций

andreymx + - * / and or xor

потому, ответа на поставленный вопрос никто пока не дал.
...
Рейтинг: 0 / 0
максимум без if
    #38812608
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно было сделать так:

Код: plaintext
1.
int t=a%b;


если а больше b то t>=1, в противном случае 0. Нужно установить t в 1, в том случае, если t>1. Это можно сделать следующим образом
Код: plaintext
1.
t=(t+2)%(t+1);


если t было равно 0, то получим 2, если больше нуля, то получим число вида , это число не является целым, потому следующей операцией будет следующая
Код: plaintext
1.
t=t%2;


Если t было равно 2, то мы получим 0, в противном случае, мы получим остаток 1. Таким образом, если a>b, то t=1, в противном случае, 0. Выражение вида
Код: plaintext
1.
int max=t*(a-b)+(1-t)(b-a);


даст вам то, что требуется.

PS
скорее всего, в реализации операции % тем или иным образом присутствует условие, но в данном случае, оно менее явное чем в остальных случаях. И тут я так-же не использовал только те операции что вы предлагали. Код не тестировал, проверьте сами
...
Рейтинг: 0 / 0
максимум без if
    #38812610
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftПридумать-то можно, но зачем?

Псевдокод:
Код: sql
1.
2.
3.
4.
5.
6.
int max(int a, int b)
(
  t[0]=a;
  t[1]=b;
  return a[sign(sign(b-a)+1)];
}

sign можно реализовать без if, например, сдвигами и бинарными операциями.

тогда уже
Код: plaintext
1.
 a*sign[a-b]+b*(1-sign[a-b]);


так читабельней. Может и можно реализовать, не помню. Надеюсь автор доведёт дело до конца, и напомнит как это сделать.
Хотя тут и думать не нужно, это элементарно, вот так:
Код: plaintext
1.
2.
3.
4.
int sign(int x)
{
    return x>>31;
}


данная функция вернёт 1 если число отрицательно и 0 в противном случае, таким образом, получим следующий результирующий код
Код: plaintext
1.
2.
int a,b;
int max=sign(a-b)*b+(1-sign(a-b))*a;



В общем мысль и идея понятны, тестируйте, не проверял этот код.

PS
но опять таки, в данном коде присутствуют лишние операции
...
Рейтинг: 0 / 0
максимум без if
    #38812639
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНа самом деле все предложенные алгоритмы содержат неявный if. Если вы видите знак больше или меньше, то мы уже говорим о каком-либо условии. Казалось бы вариант предложенный Яростным мечом подходит, но и это не так. Ибо вычисление модуля подразумевает условие, кроме того, модуль не был в числе допустимых операций
abs() можно реализовать так sqrt(x*x)
...
Рейтинг: 0 / 0
максимум без if
    #38812640
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

покажите как вы реализуете корень :)
...
Рейтинг: 0 / 0
максимум без if
    #38812644
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй вариант получить множитель 1 для положительного, -1 для отрицательного, т.е. sign()
в двоичном представлении 00000001 и 11111111 соответственно, старший бит это знак для типов со знаком.
далее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int my_sign(int x)
{
	unsigned int u = x & 0x80000000; // берем старший бит исходного числа
	for(int i = 0; i < 31; i++) { // заполняем им все биты
		u |= (u >> 1);
	}
	return u | 1; // устанавливаем младший бит в 1 для положительных
}
...
Рейтинг: 0 / 0
максимум без if
    #38812648
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
i < 31



явный if
...
Рейтинг: 0 / 0
максимум без if
    #38812649
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima T,

покажите как вы реализуете корень :)
Корень можно вычислить как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#lang racket
(define (average x y)
  (/ (+ x y) 2))
(define tolerance 0.00000001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
(try first-guess))
(define (sqrt x)
  (fixed-point (lambda (y) (average y (/ x y)))
               1.0))

(sqrt 1024)

32.0
>
...
Рейтинг: 0 / 0
максимум без if
    #38812650
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
i < 31



явный if
а так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int my_sign(int x)
{
	unsigned int u = x & 0x80000000; // берем старший бит исходного числа
	// заполняем им все биты
	u |= (u / 2);
	u |= (u / 2);
	... и еще 29 раз повторить эту строчку
	return u | 1; // устанавливаем младший бит в 1 для положительных
}
...
Рейтинг: 0 / 0
максимум без if
    #38812651
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxнапомните, есть ли алгоритм вычисления максимума из двух чисел без if
А вообще, по идее на scheme просто
Код: sql
1.
2.
3.
(max 3 5)
5
>
...
Рейтинг: 0 / 0
максимум без if
    #38812652
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoSashaMercuryDima T,

покажите как вы реализуете корень :)
Корень можно вычислить как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#lang racket
(define (average x y)
  (/ (+ x y) 2))
(define tolerance 0.00000001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
(try first-guess))
(define (sqrt x)
  (fixed-point (lambda (y) (average y (/ x y)))
               1.0))

(sqrt 1024)

32.0
>



вы используете тернарный оператор, значит используете if
...
Рейтинг: 0 / 0
максимум без if
    #38812653
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
2.
3.
	u |= (u / 2);
	u |= (u / 2);
	... и еще 29 раз повторить эту строчку



Кстати можно обойтись 8-ю строчками
...
Рейтинг: 0 / 0
максимум без if
    #38812654
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryвы используете тернарный оператор, значит используете if
Да там и if есть самый настоящий. Но по сабжу я уже ответил
Программа:(max 5 3)
Результат: 5
...
Рейтинг: 0 / 0
максимум без if
    #38812655
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDima T
Код: plaintext
1.
2.
3.
	u |= (u / 2);
	u |= (u / 2);
	... и еще 29 раз повторить эту строчку



Кстати можно обойтись 8-ю строчками



а чем это лучше предложенного кода ранее
SS
Код: plaintext
1.
2.
3.
4.
int sign(int x)
{
    return x>>31;
}
...
Рейтинг: 0 / 0
максимум без if
    #38812657
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoSashaMercuryвы используете тернарный оператор, значит используете if
Да там и if есть самый настоящий. Но по сабжу я уже ответил
Программа:(max 5 3)
Результат: 5

а вы посмотрите как в Scheme реализована эта функция :)
...
Рейтинг: 0 / 0
максимум без if
    #38812660
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа чем это лучше предложенного кода ранее
SS
Код: plaintext
1.
2.
3.
4.
int sign(int x)
{
    return x>>31;
}


Тем что я его не заметил выше :)

Только правильно так
Код: sql
1.
2.
3.
4.
int sign(int x)
{
    return (x>>31) | 1;
}
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 1 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / максимум без if
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]