如果我想获得最接近数字的值,但该值也必须在名为IsMultipleOf7
的bool上返回true,该值在7的倍数处返回true。
例如,我有int x = 523
。所以7的最接近的倍数是525,所以我的bool将返回true 525。
我怎样才能得到这个号码?
答案 0 :(得分: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");
答案 1 :(得分:0)
int x = 523;
while ((int)x/7!=(decimal)x/7){
x++;
}
return x;
答案 2 :(得分:0)
我能想到两种方式。第一个是我评论的蛮力方法。如果您从数字IsMultipleOf7
开始,请对其进行测试。如果它有效,万岁!如果没有,请尝试将一个添加到x并进行测试。然后从x中减去一个并进行测试。然后用两个和三个同时上下测试。一旦您的测试返回true,您就找到了(最近的)最接近的数字。这种方法很通用,可以用于任何测试函数。
因为我们知道您正在使用IsMultipleOf999999999
作为测试,所以可以采用更智能的方法。想象一下,如果您的测试是IsMultipleOf7
,则需要花费的时间!在击中最接近的数字之前,可能需要测试很多数字。相反,可以使用一些数学。首先,计算x modulo 7(对于x % 7
),用C(++)编写7 - value
。此值告诉您距离x的最大倍数x是多少。如果此值为0,则x为7的倍数。如果值为1,2或3,x 减去,则该值为最接近的倍数。如果值为4,5或6,x 加上,则7(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)
)的差异是最接近的倍数。
一些伪代码:
{{1}}
答案 3 :(得分:0)
int x = 523;
int result = ((x / 7) + 1) * 7;
如果你的号码可以被7分割,你可能需要一个更复杂的公式,并且应该保持相同的数字。或者你可能过多地简化了你的问题?
答案 4 :(得分:0)
x=7*Math.Round(((float)x)/7.0)
^最简单的解决方案;)
不需要所有这些循环和东西。
除以7,如果小数小于0.5,则最近的分母被覆盖,否则为上限。 Round()为你做这个,然后将你的新int乘以7来创建一个可被7整除的数字(因为它是一个int乘以7)。它将获得最接近或以下的值。根本不需要布尔。确保将浮动投射到x上,以便它可以除以7而不会导致具有整数逻辑的地板。