c++ - 如何“溢出”超出特定范围的值(如 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 == 1
或length * numRanges == dist
返回值有时超出范围。
例如:如果范围是30-100
并且整数是-40
我希望返回值是30
但它实际上是100
。
解决方案
你可以用整数数学来解决这个问题:
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;
}
推荐阅读
- swift - Swift用嵌套字典替换字典数组中的键值
- exception - SICStus Prolog 中的 create_mutable/2
- python - discord.py-rewrite - 如何为某些用户覆盖和更改冷却时间?
- python - 如何从裁剪的 numpy 矩形中定义顶部和左侧点?
- javascript - 注册表单 + Stripe JS - 我必须点击两次提交
- python - python龙卷风404与vuejs
- python - 如何将多个 excel xlsm 文件与一个数据集中的多个工作表合并?
- c - printf() 中大浮点数的奇怪行为并分配给 int
- java - 为什么在这里创建一个新变量会产生不同的值?
- javascript - 如何让我的 Intersection Observer 只将 div 放在屏幕上一次而不在用户滚动时将其移除?