Печать наибольшего из двух значений БЕЗ использования операторов if - PullRequest
0 голосов
/ 31 января 2019

Я делаю домашнее задание на C, и у меня возникли небольшие проблемы.После вычисления двух значений я должен иметь возможность вывести наибольшее из двух значений без , используя логические операторы, реляционные операторы или конструкции выбора.Я уже использовал вычисления, которые определяют большее из двух значений, но я не знаю, насколько это будет полезно в будущем.

Я также хотел бы уточнить, что я не печатаю максимальное значение, скорее я должен напечатать максимальный параметр.Например, если опция 1 = 2000, а опция 2 = 3000, я хочу иметь возможность распечатать «вариант 2 - это больший».

Я также должен сказать, что после остальной части задания этовыбор обычно выполняется только математическими операциями +*-%/ и pow()

Ответы [ 6 ]

0 голосов
/ 31 января 2019

Это больше похоже на математическую задачу:

#include<math.h>
#include<stdlib.h>
#include<stdio.h>

int main(){

  int o1 = 4;
  int o2 = 2;

  //res > 0 if, and only if, o2 > o1
  int res = o2 - o1;

  // module of res
  double module = pow(pow(res, 2), 0.5);

  //res2 = 1 if res > 0
  //res2 = -1 if res < 0
  int res2 = res/(int)module;

  printf("option%d is greater.\n", (3+res2)/2);

  return 0;
}

Предупреждение 1: Не работает, когда o1 == o2

Предупреждение 2: Этот ответ рассматривает эту проблему какматематическая проблема.Система в C не гарантирует, что в качестве точного числа будет указано значение типа double, но оно является приближенным.Таким образом, как указал chux, он может не дать правильный ответ для больших чисел.

Вы можете иметь double a = x/|x|, давая a значение 0.9999 в C, делая int b = (int)a имеющим значениеиз 0

0 голосов
/ 31 января 2019

Без массивов, как я понимаю, они не допускаются.Только математика

void printlarger(int a, int b)
{
    printf("%d\n", a * (int)pow(a/b, b/a) + b * (int)pow(b/a, a/b));
}


int main()
{
    printlarger(3,2);

    return 0;
}
0 голосов
/ 31 января 2019

старшее из двух значений
выполняется только с помощью математических операций (+ * -% / и pow)

Когда оба значения> 0, найдите 2 коэффициента a /б, б / а.Один из факторов будет 0 (при условии, что типы являются целыми числами), а другой 1 или более.(Или оба коэффициента равны 1, если значения одинаковы).

Выполнить

pow(one_or_more, 0);  // 1 (v2 > v1)
pow(0, one_or_more);  // 0 (v1 > v2) 
pow(1,1);             // 1 (same)

Используйте 0,1 для индексации ответа.

Пример

int a[2] = { value1, value2 };
int index = pow(a[1]/a[0], a[0]/a[1]);
printf("%d\n", a[index]);
// or "to print the maximum option"
printf("%d\n", index);

Допустимое использование pow() намекает на этот подход.

Побочное преимущество: переполнения нет, если значения> 0. -,+,* имеют тенденцию открывать дверь для возможности переполнения, и этого избегают.

Обратная сторона: проблема со значениями <= 0. </p>

0 голосов
/ 31 января 2019

Идея состоит в том, чтобы использовать знаковый бит в качестве индекса для массива.

signed char index1 = (option1value - option2value) >> 7;
signed char index2 = (option2value - option1value) >> 7;

Если option1value > option2value, то старший бит в index1 будет равен 0, а после сдвигов - 0.

Если option1value < option2value, то старший бит в index1 будет равен 1, а после сдвигов - 1.

Вы помещаете свой «словесный текст» в массив, используя индексы.Затем всегда печатайте из индекса 0.

Вам необходимо выбрать правильный тип данных для ваших значений и настроить биты сдвига.

0 голосов
/ 31 января 2019

Я бы использовал функцию fmax .В качестве аргументов используются двойные числа, поэтому вам, возможно, придется преобразовать числа в двойные.

0 голосов
/ 31 января 2019

Большее из двух int типов x и y равно

x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1)))

x равно z, если x ^ z равно 0, и аналогично для y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...