Сравнение трех целых чисел в C

Я хочу напечатать 1, если три входа отличаются друг от друга, или напечатать 0, если какой-то ввод повторяется более одного раза.

Это мой код:

int main() {
   int a, b, c;
   a = 11;
   b = 22;
   c = 11;

   if (a==b && a==c)
    printf("0");
    else if (b==c)
    printf("0");
   else
    printf("1");

   if (a > b && a>c)
    printf("1");
   else if (b>a && b >c)
    printf("1");
   else if (c>a && c >b)
   printf("1");
   else
    printf("0");

   return 0;

}

Не могли бы вы уточнить, почему вы нам это рассказываете? Вы даже не задаете вопрос

hellow 03.09.2018 10:53

В чем проблема

Shivani Katukota 03.09.2018 10:53

Найдите время, чтобы прочитать страницы помощи, особенно разделы с названиями "Какие темы я могу спросить здесь?" и «Какие типы вопросов мне следует избегать?». Также пожалуйста взять тур и читай о том, как задавать хорошие вопросы. Наконец, прочтите этот контрольный список вопросов.

Some programmer dude 03.09.2018 10:53

Вы сказали нам, что хотите сделать, и показали свой код, хорошо. А каков твой вопрос?

StoryTeller - Unslander Monica 03.09.2018 10:53

прочтите о разнице между && и ||, а затем используйте соответственно.

Sourav Ghosh 03.09.2018 10:54

Я хочу напечатать 1, если три входа отличаются друг от друга, или напечатать 0, если какой-то ввод повторяется более одного раза.

Piyush Basak 03.09.2018 10:56

«Я хочу сделать X, если Y» - не вопрос

StoryTeller - Unslander Monica 03.09.2018 10:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
7
108
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете упростить свой код, чтобы он был

 if (a==b || a==c || b==c)
     printf("0");
    else
     printf("1");

Или даже: printf(a==b || a==c || b==c ? "0" : "1");

arorias 03.09.2018 10:58

@arorias Или даже: printf("%c", '1' - (a==b || a==c || b==c)); ;-)

Scheff's Cat 03.09.2018 11:11

@Scheff Или даже: printf("%d", !(a==b || a==c || b==c));

arorias 03.09.2018 11:15

@arorias Я не могу превзойти это (хотя я думал заменить реляционные операторы поразрядными, чтобы улучшить предварительная выборка кеша.) ;-)

Scheff's Cat 03.09.2018 11:18
Ответ принят как подходящий

Я бы сделал это так:

int different(int a, int b, int c)
{
  return a != b && b != c && a != c;
}

Это вернет 1, если все три числа различны, иначе он вернет 0, что должно означать, что существует по крайней мере одна пара дубликатов.

Используйте это так:

printf("%d\n", different(11, 22, 11));

который напечатает:

0

пожалуйста, посмотрите изображение pasteboard.co/HC9xu3I.png

Piyush Basak 03.09.2018 11:09

@PiyushBasak Да? Это не тот код ... Я не понимаю твою точку зрения.

unwind 03.09.2018 11:18

Предлагаю (когда в настроении играющий)

printf("%d\n", !(!!(a - b) * !!(a - c) * !!(b - c)));

Действительно необычно, но уязвимо для переполнения int, в отличие от простых проверок ==, которые вы можете выполнить. Хотя это именно то, как вы бы сделали это на ассемблере. Проголосуйте.

Bathsheba 03.09.2018 11:11

@bathsheba: переполнение int на a - b? Да, это возможно. Операнды умножения всегда 0 или 1.

pmg 03.09.2018 11:14

Да, a - b действительно уязвим, хотя мне действительно не нравится этот аспект языка. Но это отличное решение, так как оно не разветвляется.

Bathsheba 03.09.2018 11:15

можно было бы вместо умножения еще и xoring делать? (что было бы более очевидно: D)

hellow 03.09.2018 13:34

@hellow: хммм, xor не заменяет мультипликацию: 1*0*0 != 1^0^0

pmg 03.09.2018 16:47

Верно. Как я это придумал? :(

hellow 03.09.2018 16:50

Другие вопросы по теме