如果我想获得与数字最接近的值,但该值也必须在名为IsMultipleOf7
的bool上返回true,该值在7的倍数处返回true。获取距离最近的值,在布尔上返回true
例如,我有一个int x = 523
。所以7的最接近倍数是525,所以我的布尔将返回真实525.
我怎样才能得到这个数字?
如果我想获得与数字最接近的值,但该值也必须在名为IsMultipleOf7
的bool上返回true,该值在7的倍数处返回true。获取距离最近的值,在布尔上返回true
例如,我有一个int x = 523
。所以7的最接近倍数是525,所以我的布尔将返回真实525.
我怎样才能得到这个数字?
int x = 523;
while ((int)x/7!=(decimal)x/7){
x++;
}
return x;
如果x = 526,该怎么办?最近的仍然是525,但你的代码将返回532。 – J0HN
有两种方法我可以想到。首先是我评论的强力方法。如果您从号码x
开始,请对其进行测试。如果有效,万岁!如果不是,请尝试向x添加一个并进行测试。然后从x中减去一个并进行测试。然后用两个和三个同时进行测试。一旦你的测试返回true,你就找到了最接近的数字(一个)。这种方法是一个通用的方法,可以用于任何测试功能。
因为我们知道您正在使用IsMultipleOf7
作为测试,所以可以采用更智能的方法。想象一下,如果你的测试是IsMultipleOf999999999
,那就需要花费时间!如此多的数字可能需要在接近最近之前进行测试。相反,可以使用一些数学。首先,计算x模7(用于IsMultipleOf7
),用C(++)写成x % 7
。这个值告诉你X距离LESS的最大倍数是多少。如果此值为0,则x是7的倍数。如果值为1,2或3,则x 减去该值是最接近的倍数。如果值为4,5或6,则x 加上使得7的差值(7 - value
)是最接近的倍数。
一些伪代码:
x = 523
value = x modulo 7
if(value == 0):
return x
if(value < 4): // that is, less than half of 7
return x - value
otherwise
return x + (7 - value)
int x = 523;
int result = ((x/7) + 1) * 7;
你可能需要一个更复杂的公式,如果您的号码是7整除,并应保持相同的号码。或者你可能已经简化了你的问题了?
该函数将返回的7
最接近的数倍或数本身如果是7
public int GetClosestNumber(int number, out bool isMultipleOf7)
{
// if the number is a multiple of 7 isMultipleOf7 is set to true
isMultipleOf7 = number%7 == 0;
if (isMultipleOf7)
{
// if it's a multiple of 7 then the closest one is the number itself
return number;
}
// if it's not a multiple of 7 then try find the closest.
var lower = number - (number % 7);
var upper = (number + 7) - (number %7);
var diffL = Math.Abs(number - lower);
var diffU = Math.Abs(number - upper);
return diffL > diffU ? upper : lower;
}
的倍数,这里有一个使用示例:
bool IsMultipleOf7;
// Following line will output: Closest multiple of 7 is: 525
Console.WriteLine("Closest multiple of 7 is: {0}",
GetClosestNumber(523, out IsMultipleOf7));
// Following line will output: The number itself is not a multiple of 7"
Console.WriteLine("The number itself is {0} a multiple of 7",
IsMultipleOf7 ? string.Empty: "not");
x=7*Math.Round(((float)x)/7.0)
^最简单的解决方案就在那里;)
不需要所有这些循环和东西。
除以7,如果小数小于0.5,则最接近的分母是floored,否则是ceiling。 Round()为你做了这个,然后把你的新int乘以7来创建一个可以被7整除的数字(因为它是一个int乘以7)。它将得到以下最接近的值或以下。根本不需要布尔。确保你在x上浮动,这样它可以被7除以不会导致整数逻辑地板。
我能想到的最明显的就是测试数字x,然后测试下面和上面的数字,然后测试下面的数字和上面的数字等,等等,并继续以这种方式:一个蛮力。 – bimmo
我更喜欢是否有另一种方式来做到这一点,而不是蛮力,因为我的真实数字是巨大的,而蛮力的确会减慢我制作的节目的速度。如果IEnumerable中存在类似的东西,它会非常棒。在IEnumerable中,它可以跳过所有在bool中返回false的东西。 – gcnew
它什么时候会返回false?要求不清楚。 –