Мне дали это задание кодирования, и вот что я придумал. Есть ли лучший и эффективный способ сделать это?
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);
}
}
Как насчет:
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 за указание этого!) И не обрабатываются здесь. Обработка этих краевых случаев будет зависеть от требований к функциям для указанных случаев кромок. Просто нужно знать, был ли это производственный код.
Ваш вопрос спрашивает "возвращает", поэтому я бы изменил функцию, чтобы фактически вернуть это значение.
Кроме того, я бы сделал его модульным, добавив значение в качестве параметра.
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);
}
Версия, которая также будет учитывать равенство, может использовать что-то вроде 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;
}
}
Там может быть место, чтобы немного поразмыслить, но вы поняли.
false
для равных, и поэтому вернет num1. В противном случае, да, у меня нет хорошего ответа для случая равных, учитывая, что он должен «возвращать значение» (вы, очевидно, не можете вернуть два значения без серьезного изменения требований).