2015-10-24 23 views
-3

如果我想获得与数字最接近的值,但该值也必须在名为IsMultipleOf7的bool上返回true,该值在7的倍数处返回true。获取距离最近的值,在布尔上返回true

例如,我有一个int x = 523。所以7的最接近倍数是525,所以我的布尔将返回真实525.

我怎样才能得到这个数字?

+0

我能想到的最明显的就是测试数字x,然后测试下面和上面的数字,然后测试下面的数字和上面的数字等,等等,并继续以这种方式:一个蛮力。 – bimmo

+0

我更喜欢是否有另一种方式来做到这一点,而不是蛮力,因为我的真实数字是巨大的,而蛮力的确会减慢我制作的节目的速度。如果IEnumerable中存在类似的东西,它会非常棒。在IEnumerable中,它可以跳过所有在bool中返回false的东西。 – gcnew

+0

它什么时候会返回false?要求不清楚。 –

回答

0
int x = 523; 
while ((int)x/7!=(decimal)x/7){ 
    x++; 
} 
return x; 
+0

如果x = 526,该怎么办?最近的仍然是525,但你的代码将返回532。 – J0HN

0

有两种方法我可以想到。首先是我评论的强力方法。如果您从号码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) 
0
int x = 523; 

int result = ((x/7) + 1) * 7; 

你可能需要一个更复杂的公式,如果您的号码是7整除,并应保持相同的号码。或者你可能已经简化了你的问题了?

1

该函数将返回的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"); 

Live demo is also available here

0

x=7*Math.Round(((float)x)/7.0)

^最简单的解决方案就在那里;)

不需要所有这些循环和东西。

除以7,如果小数小于0.5,则最接近的分母是floored,否则是ceiling。 Round()为你做了这个,然后把你的新int乘以7来创建一个可以被7整除的数字(因为它是一个int乘以7)。它将得到以下最接近的值以下。根本不需要布尔。确保你在x上浮动,这样它可以被7除以不会导致整数逻辑地板。