给出两个整数的方法返回最接近1000的值

时间:2014-05-21 22:22:15

标签: c#

我接受了这个编码任务,这就是我想出的。是否有更好,更有效的方法来做到这一点?

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 个答案:

答案 0 :(得分:8)

怎么样:

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

这将距离设置为1000(使用Math.Abs返回数字和减法的绝对值以获得相对距离),然后使用三元数来获取比较结果并返回正确的值。

请注意,这并不能很好地处理equals情况(它会返回num1),但是你只能有一个返回值。

使方法通用肯定是一种更好的方法:

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

使用int.MinValueint.MaxValue会导致溢出(感谢@ConradFrix指出这一点!),并且不会在这里处理。这些边缘情况的处理将取决于所述边缘情况的功能要求。如果这是生产代码,请注意一些事项。

答案 1 :(得分: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);
}

答案 2 :(得分:1)

同样考虑平等的版本可以使用IComparable&#39; s CompareTo之类的东西,它返回-1表示小于0,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 s为-1,0和1.请记住-1表示num1更接近,1表示num2更接近。< / p>

完成代码后,在原始示例方法中使用它将如下所示:

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;
    }
}

可能还有一些空间可以让你有所收获,但你明白了。