Метод, который дал два целых числа, возвращает значение, которое ближе всего к 1000

1

Мне дали это задание кодирования, и вот что я придумал. Есть ли лучший и эффективный способ сделать это?

public void GetNumberClosestToValue(int num1, int num2)
{
    int numberToCompareTo = 1000;

    try
    {
        int modNum1 = num1 % numberToCompareTo;
        int modNum2 = num2 % numberToCompareTo;

        int quotientNum1 = num1 / numberToCompareTo;
        int quotientNum2 = num2 / numberToCompareTo;

        if (num1 == num2 || Math.Abs(numberToCompareTo - num1) == Math.Abs(numberToCompareTo - num2))
            Console.WriteLine("Both numbers {0} , {1} are equally closer to {2} ", num1, num2, numberToCompareTo);
        else if (quotientNum1 == quotientNum2)
            Console.WriteLine("Number Closest to {0} is {1}", numberToCompareTo, modNum1 > modNum2 ? num1 : num2);
        else if (Math.Abs(quotientNum1) > Math.Abs(quotientNum2))
            Console.WriteLine("Number Closest to {0} is {1}", numberToCompareTo, num2);
        else
            Console.WriteLine("Number Closest to {0} is {1}", numberToCompareTo, num1);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
Теги:

3 ответа

8
Лучший ответ

Как насчет:

public int GetNumberClosestTo1000(int num1, int num2)
{
    return Math.Abs(1000 - num1) > Math.Abs(1000 - num2) ? num2 : num1;
}

Это получает расстояние до 1000 (используя Math.Abs который возвращает абсолютное значение числа и вычитания, чтобы получить относительное расстояние), а затем использует тройной, чтобы взять результаты сравнения и вернуть правильное значение.

Обратите внимание, что это не справляется с ситуацией равным всем, что хорошо (он вернет num1), но вы можете иметь только одно возвращаемое значение.

Создание универсального метода, безусловно, будет лучшим подходом:

public int GetNumberClosestToValue(int num1, int num2, int value)
{
    return Math.Abs(value - num1) > Math.Abs(value - num2) ? num2 : num1;
}

Использование int.MinValue или int.MaxValue приведет к переполнению (спасибо @ConradFrix за указание этого!) И не обрабатываются здесь. Обработка этих краевых случаев будет зависеть от требований к функциям для указанных случаев кромок. Просто нужно знать, был ли это производственный код.

  • 0
    Это возвращает num1, когда они одинаково далеки, но в противном случае я бы так и сделал.
  • 0
    @ConradFrix, выражение будет равно false для равных, и поэтому вернет num1. В противном случае, да, у меня нет хорошего ответа для случая равных, учитывая, что он должен «возвращать значение» (вы, очевидно, не можете вернуть два значения без серьезного изменения требований).
Показать ещё 3 комментария
2

Ваш вопрос спрашивает "возвращает", поэтому я бы изменил функцию, чтобы фактически вернуть это значение.

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

public int GetNumberClosestToValue(int num1, int num2, int value)
{
    return Math.Abs(value - num1) < Math.Abs(value - num2) ? num1 : num2;
}

Затем вы можете просто называть его следующим:

int closest = GetNumberClosestToValue(x, y, 1000);

Или перегрузите его:

public int GetNumberClosestToValue(int num1, int num2)
{
    return GetNumberClosestToValue(num1, num2, 1000);
}
  • 0
    Это не возвращает реальные цифры, только наименьшее расстояние.
  • 0
    Ack! Вы правы. Полностью пропустил это.
Показать ещё 3 комментария
1

Версия, которая также будет учитывать равенство, может использовать что-то вроде IComparable CompareTo, которая возвращает -1 меньше, чем 0, а для +1 - больше:

public int CompareAbsoluteDistanceFromValue(int num1, int num2, int value)
{
    var abs1 = Math.Abs(value-num1);
    var abs2 = Math.Abs(value-num2);
    return abs1.CompareTo(abs2);
}

Затем вы можете легко switch на CompareAbsoluteDistanceFromValue(num1, num2, 1000), в case для -1, 0 и 1. Помните, что -1 означает, что num1 ближе, 1 означает, что num2 ближе.

Итак, завершение кода, используя это в вашем исходном методе примера, будет выглядеть так:

public void GetNumberClosestToValue(int num1, int num2)
{
    int numberToCompareTo = 1000;
    switch(CompareAbsoluteDistanceFromValue(num1, num2, numberToCompareTo))
    {
        case -1:
            Console.WriteLine("Number Closest to {0} is {1}", numberToCompareTo, num1);
            break;
        case 0:
            Console.WriteLine("Both numbers {0} , {1} are equally closer to {2} ", num1, num2, numberToCompareTo);
            break;
        case 1:
            Console.WriteLine("Number Closest to {0} is {1}", numberToCompareTo, num2);
            break;
    }
}

Там может быть место, чтобы немного поразмыслить, но вы поняли.

  • 0
    +1 для сравнения стилей cstring ( напоминает, если операторы с strcompare и shudders )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню