给定两个整数的方法返回最接近1000的值
本文关键字:方法 返回 最接近 的值 1000 整数 两个 | 更新日期: 2023-09-27 18:04:26
我被分配了这个编码任务,这是我想到的。有没有更好、更有效的方法来做到这一点?
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);
}
那么你可以很容易地在CompareAbsoluteDistanceFromValue(num1, num2, 1000)
上switch
, case
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;
}
}