首页 > 解决方案 > 如何“溢出”超出特定范围的值(如 30 - 100)

问题描述

我创建了一个结构“Range”,其中包含两个整数,称为 min 和 max。我正在尝试编写一个函数,该函数接受一个整数并在超出范围时将其溢出。例如,如果我有一个范围1-100并且我传入105的返回值应该是5.

当我尝试溢出高于最大值但低于最小值时发生意外行为并且我找不到正确的公式时,代码工作正常。

这是我正在使用的范围结构

struct Range
{
    int min;
    int max;
};

这是我用于下面代码的函数声明

int overflowRange(const Range &range, int n)

这是值超过 range.max 时的代码

if (n > range.max)
{
    double dist = static_cast<double>(n - range.max);
    double length = (range.max - range.min) + 1;
    //How many ranges away is n ?
    double numRanges = std::ceil(dist / length);

    return static_cast<int>(n - (length * numRanges));
}

这是值低于 range.min 时的代码

else if (n < range.min)    //n is the tested integer
{
    double dist = static_cast<double>(range.min - n);
    double length = (range.max - range.min);
    //How many ranges away is n ?
    int numRanges = static_cast<int>(dist / length);

    return static_cast<int>((range.min + length) - (dist - (length * numRanges)));
}

dist / length == 1length * numRanges == dist返回值有时超出范围。

例如:如果范围是30-100并且整数是-40我希望返回值是30但它实际上是100

标签: c++mathstruct

解决方案


你可以用整数数学来解决这个问题:

struct Range
{
    int min;
    int max;
};

int overflowRange(const Range &range, int n)
{
    int size = range.max - range.min;
    n -= range.min;
    n %= size;
    if (n < 0)
    {
        n += size;
    }
    n += range.min;
    return n;
}

推荐阅读