c++ - 如何简单地循环自定义比例

标签 c++ math

这一定是非常简单的数学,但我不知道如何解决。

我需要编写一个函数来返回一个从 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/

相关文章:

c++ - 内存泄漏预防 C++(我是对还是错?)

c++ - 运算符的不明确重载

c++ - 为什么这运行良好? (访问范围外变量的地址)

c++ - 模板函数中默认参数的实例化点

c++ - 如何从缩放图像中知道真实图像中的坐标

c++ - 是否可以在 "if"语句中声明一个变量?

c - 为什么 5/7 打印 0?

c# - 计算 X 位掩码的最快方法?

c++ - 斐波那契数列乘积之和

c++ - 如何在 C++ 中定义常量?