【问题标题】:Math Looping Between Min and Max Using Mod?使用 Mod 在最小值和最大值之间进行数学循环?
【发布时间】:2010-06-16 22:30:44
【问题描述】:

我正在尝试构建一个很小(或者可能不是那么小)的公式,该公式将包含一组最小值和最大值之间的数字,但也会循环这些数字,这样如果它们超出范围,它们就不会被剪裁。到目前为止,这就是我所拥有的。

min1 = 10
max1 = 90

val1 = 92
//will make 11, which is what i want since it loops

formula:  min(max(min1,min(val1,max1)),mod(val1,max1)+min1)

但是,我希望它也循环另一个方向,这样如果 val1 为 5,即 min1 之外的 -5,它将变为 86。

我遇到的另一个问题是

max1 % max1 != max1

如我所愿,因为最大值是范围的一部分

为了清楚起见,这里有一些基于循环范围的期望输出示例

min1 = 10
max1 = 90
----------------------------------------------
val1 = 30    //within range: stays as 30 
val1 = 90    //within range: stays as 90
val1 = -6    //below range: loops to becomes 75
val1 = 98    //above range: loops to becomes 17
val1 = 91    //above range: loops to becomes 10

我不想诉诸于使用一系列 if/else 语句,但如果它是绝对需要的,一个就可以了。这有可能吗?

【问题讨论】:

  • 我认为您的最后一个示例应该是 17,而不是 18,因为您也应该数 10。不是吗?你真的希望 91 是 11 而不是 10 而 90 是 90?
  • 在您的示例中,90 是否保持 90 和 91 变为 11?那么没有什么变成10了吗? 170应该怎么办?变成90还是10?这是相当奇怪的“循环”。另外,-6怎么会变成84? -6 是 16 个数字,与最小值相差甚远,所以它应该在 90-16=74 左右,还是什么?
  • 哦..哈...是的,我完全写错了。 -6 应该是 74,而不是 84。抱歉。
  • 回复:Mehrdad Afshari。老实说,我不知道我在写这篇文章时在想什么。你是绝对正确的。 91 应该是 10 以形成正确的循环。 9 应该是 90,8 是 89。我真的很抱歉,伙计们,我一直在向你发送错误的方向。

标签: math module range


【解决方案1】:
int loop(int val, int min, int max)
{
    int p = max-min+1;
    int mod = (val-min)%p;
    if(mod<0)
        mod += p;
    return min+mod;
}

【讨论】:

  • 为什么不从if (val == max) return max;开始?
  • 非常抱歉。自从我的循环逻辑搞砸以来,我一直在误导你。你之前注意到了,但直到现在我还不太明白。 91 应该是 10,而不是 11。9 应该变成 90,等等以使循环正确。
【解决方案2】:

从数学上讲,你应该可以做这样的事情:

((val-min) `mod` (max-min+1)) + min

将您的范围向下移动到从零开始,剪掉高端,然后将其移回正确的范围。不幸的是,C 中的 % 运算符对负数给出了否定的结果。所以:

3 % 10 => 3
13 % 10 => 3
-3 % 10 => -3
-13 % 10 => -3

所以为了摆脱这些负面影响,我们需要一个额外的模数:

((val-min)%(max-min+1) + (max-min+1)) % (max-min+1) + min

【讨论】:

  • 这正是我和 Pavel 正在做的事情,但您的解决方案不检查 val
  • Re Rotsor:应该可以解决它。
【解决方案3】:

对不起。删除了之前的答案。试试这个:

((val-min)%(max-min)+max-min)%(max-min)+min

编辑:如果您希望 max 成为有效值而不是溢出到 min,请在所有 3 个位置将 max 替换为 max+1。

【讨论】:

  • 谁使用两个部门而不是一个部门? :) 此外,90 将变为 10。
  • 抱歉,pavel,我已经编辑了我的问题,因为我的循环逻辑混淆了。
  • @rotsor: int Modulo(int x, int y) { int answer = x % y;返回答案
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2016-10-06
  • 2018-09-21
  • 2021-06-17
  • 2013-10-05
  • 2019-09-18
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多