这一定是非常简单的数学,但我不知道如何解决。
我需要编写一个函数来返回一个从 1 到 3 的数字,如下所示:
input: -5 output: 1
input: -4 output: 2
input: -3 output: 3
input: -2 output: 1
input: -1 output: 2
input: 0 output: 3
input: 1 output: 1
input: 2 output: 2
input: 3 output: 3
input: 4 output: 1
input: 5 output: 2
input: 6 output: 3
input: 7 output: 1
下面的函数对正数很有效
static const int getOnScaleOneToThree(int input)
{
int x = ceil(input / 3);
return abs((input - (x * 3)));
}
但它(当然)会像这样反转负输入:
input: -6 output: 3
input: -5 output: 2
input: -4 output: 1
input: -3 output: 3
input: -2 output: 2
input: -1 output: 1
input: 0 output: 3
input: 1 output: 1
input: 2 output: 2
input: 3 output: 3
有什么想法吗? 谢谢!
最佳答案
这应该可行,并且避免了具有负数的模运算的依赖于实现的结果。
if(input >= 0)
{
return (1 + ((input + 2) % 3));
}
else
{
return (3 - ((-input) % 3));
}
此外,这是一个更通用(也更冗长)的解决方案:
static const int getOnScale(int input, int minVal, int maxVal, int zeroVal)
{
if(input == 0)
{
//Might as well return this right away.
return zeroVal;
}
else
{
if(maxVal >= minVal)
{
int divisor = maxVal - minVal + 1;
if(input > 0)
{
int dividend = input + zeroVal - minVal;
return (minVal + (dividend % divisor));
}
else
{
int dividend = maxVal - zeroVal - input;
return (maxVal - (dividend % divisor));
}
}
else
{
//Reverse scale
int divisor = minVal - zeroVal + 1;
if(input > 0)
{
int dividend = minVal - zeroVal + input;
return (minVal - (dividend % divisor));
}
else
{
int dividend = -input + zeroVal - maxVal;
return (maxVal + (dividend % divisor));
}
}
}
}
在这个问题的情况下,这个函数将被称为:
getOnScale(input, 1, 3, 3);
关于c++ - 如何简单地循环自定义比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810929/