C# 给定两个整数的方法返回最接近1000的值

C# 给定两个整数的方法返回最接近1000的值,c#,C#,我被分配了这个编码任务,下面是我的想法。有没有更好更有效的方法 public void GetNumberClosestToValue(int num1, int num2) { int numberToCompareTo = 1000; try { int modNum1 = num1 % numberToCompareTo; int modNum2 = num2 % numberToCompareTo; int qu

我被分配了这个编码任务,下面是我的想法。有没有更好更有效的方法

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
返回一个数字的绝对值,然后通过减法获得相对距离),然后使用三元值获取比较结果并返回正确的值

请注意,这并不能很好地处理equals情况(它将返回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 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.MinValue
int.MaxValue
会导致溢出(感谢@ConradFrix指出这一点!),此处不处理。这些边缘案例的处理将取决于所述边缘案例的功能要求。如果这是生产代码,请注意。

您的问题询问“返回”,因此我将修改函数以实际返回该值

此外,我将通过添加值作为参数使其模块化

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

public int GetNumberClosestToValue(int num1, int num2)
{
    return GetNumberClosestToValue(num1, num2, 1000);
}
您的问题询问“returns”,因此我将修改函数以实际返回该值

此外,我将通过添加值作为参数使其模块化

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

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);
}
然后,您可以轻松地
打开
CompareableSolutionDistanceFromValue(num1、num2、1000)
,使用
大小写
s表示-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;
    }
}

可能有一些地方可以整理一下,但你明白了。一个同样可以解释相等的版本可以使用类似于
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);
}
然后,您可以轻松地
打开
CompareableSolutionDistanceFromValue(num1、num2、1000)
,使用
大小写
s表示-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;
    }
}


可能还有空间整理一下,但你明白了。

在执行
1000-num1
1000-num2
之后,你不能只取其中最小值的绝对值吗?这更适合于代码审查或代码高尔夫,你不觉得吗?@SteveWellens-这个问题显示出你在操作部分做得很好,所以我真的认为不管是考试、家庭作业还是面试问题都无关紧要。也许更好的CR网站。。。但我也这么认为。我真的不知道部门的东西是干什么用的。不过,这确实显示了一些努力和新颖的方法!抱歉,伙计们,如果我在错误的论坛发布,你能给我一个代码审查网站的链接吗?你能不能在做了
1000-num1
1000-num2
之后,只取两个网站中最小的一个的绝对值?这更适合代码审查或代码高尔夫?你不觉得吗?@SteveWellens-这个问题显示出在OP部分做得很好,所以我真的认为不管是考试、家庭作业还是面试问题都无关紧要。也许更好的CR网站。。。但我也这么认为。我真的不知道部门的东西是干什么用的。不过,这确实显示了一些努力和新颖的方法!抱歉,各位,如果我在错误的论坛上发布了帖子,你们能给我一个到任何代码审查站点的链接吗?当它们距离相等时,这将返回num1,否则我会这样做。@ConradFrix,表达式将计算为
false
表示相等,因此返回num1。否则,是的,对于equals的情况,我没有一个好的答案,因为它应该“返回值”(显然,如果不严格更改要求,就不能返回两个值)。它说的是最接近的值,因此,根据要求,只要它返回其中一个,就不需要处理它是相等的,那么op实际上没有返回任何东西。此外,如果传入int.minvalue,则会溢出。op需要指定应该发生什么there@ConradFrix我注意到OP正在打印而不是返回,但将问题标题置于样本之上(也许他不理解返回值?)。MinValue肯定是一个需要定义的边缘情况(与MaxValue一样)。当它们距离相等时,这将返回num1,否则就是我要做的。@ConradFrix,表达式将计算为
false
表示相等,因此返回num1。否则,是的,对于equals的情况,我没有一个好的答案,因为它应该“返回值”(显然,如果不严格更改要求,就不能返回两个值)。它说的是最接近的值,因此,根据要求,只要它返回其中一个,就不需要处理它是相等的,那么op实际上没有返回任何东西。如果