Нахождение наименьшего числа, которое не равно нулю - PullRequest
1 голос
/ 31 октября 2019

У меня есть три целых числа, называемых a, b, c, и мне нужно найти наименьшее их число, которое не равно 0. Но в то же время оно должно быть в состоянии обработать особый случай, когда все три числаравны 0.

Это должно быть реализовано в C или C ++ 14

Пример 1:

a = 4;
b = 0;
c = 1;

Result = c

Пример 2

a = 0;
b = 0;
c = 0;

Result = Special case

Пример 3

a = 11;
b = 46;
c = 15;

Result = a

До сих пор я не смог найти элегантный способ реализовать это в c или c ++.

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

Edit

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

Удален код, поскольку он не должен быть проверкой кода

Ответы [ 5 ]

2 голосов
/ 31 октября 2019

Если есть только три значения, использование простых операторов if может быть решением.

Тогда логика может быть ( псевдокод )

if (a is larger than zero) and (b is larger than zero and a is smaller than b) and (c is larger than zero and a is smaller than c)
    a is the smallest
else if (b is larger than zero) and (c is larger than zero and b is smaller than c)
    b is the smallest
else if c is larger than zero
    c is the smallest
else
    all are either zero or negative

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

Это, конечно, работает для больших цепочек переменных, если количество переменных фиксировано. Однако он станет громоздким довольно быстро, поэтому для более чем трех-четырех переменных следует использовать другие методы.

1 голос
/ 31 октября 2019

Объем потока управления может выглядеть следующим образом:

#include <iostream>


int find_smallest_nonzero(int a, int b, int c)
{
    if (a > 0 || b > 0 || c > 0) {
       if ((b >= a || b == 0) && (c >= a || c == 0) && (a > 0))
           return a;
       else if ((c >= b || c == 0) && (b != 0))
           return b;
       else
           return c;
    } else return -1;
}

int main() {
    std::cout 
            // permutations
            << find_smallest_nonzero(1, 2, 3) << ' '
            << find_smallest_nonzero(2, 1, 3) << ' '
            << find_smallest_nonzero(2, 3, 1) << ' '

            // one zeros
            << find_smallest_nonzero(1, 0, 3) << ' '
            << find_smallest_nonzero(0, 1, 3) << ' '
            << find_smallest_nonzero(1, 3, 0) << ' '

            // two zeros
            << find_smallest_nonzero(1, 0, 0) << ' '
            << find_smallest_nonzero(0, 1, 0) << ' '
            << find_smallest_nonzero(0, 0, 1) << ' '

            // duplicates
            << find_smallest_nonzero(2, 2, 1) << ' '
            << find_smallest_nonzero(2, 1, 2) << ' '
            << find_smallest_nonzero(1, 2, 2) << ' '

            << find_smallest_nonzero(1, 1, 2) << ' '
            << find_smallest_nonzero(1, 2, 1) << ' '
            << find_smallest_nonzero(2, 1, 1) << ' '

            // all zeros
            << find_smallest_nonzero(0, 0, 0) << '\n';
}
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1

он вернет минимальное ненулевое значение среди a, b и c, если не все 0, в этом случае возвращается -1.

Возможны более быстрые способы.

0 голосов
/ 31 октября 2019

Вы можете сделать следующее в C ++, используя std :: min

int a = 0,b = 0,c = 0;
int x = std::min( { a,b,c },
        [](const auto& n1, const auto& n2) {
             if (not n1)
               return false;
             if (not n2)
               return true;
             return n1 < n2;
         });
std::string out = x?std::to_string(x):std::string{"Special Case"};
0 голосов
/ 31 октября 2019
int lowest(int a, int b, int c) {
    auto v = {a, b, c};
    return *std::min_element(std::begin(v), std::end(v), [](int x, int y) {
        return (x < y && x != 0) || y == 0;
    });
}

Этот подход может обрабатывать любое количество элементов. В особом случае функция просто возвращает ноль (нет необходимости использовать другое специальное значение).

0 голосов
/ 31 октября 2019
if(a==0 && b==0 && c==0){
    return "Special case"
}else{
    // now put each equals zero and compare the other, last else compare all three
}

Вы можете написать функцию printf для вывода.

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