Math 使用Mod在最小值和最大值之间进行数学循环?

Math 使用Mod在最小值和最大值之间进行数学循环?,math,module,range,Math,Module,Range,我正试图建立一个很小(或者可能不是很小)的公式,它将包含一组介于最小值和最大值之间的数字,但也会循环这些数字,以便它们在超出范围时不会被剪裁。到目前为止,这就是我所拥有的 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) 但是,我希望它也循环另一个方向,这样如

我正试图建立一个很小(或者可能不是很小)的公式,它将包含一组介于最小值和最大值之间的数字,但也会循环这些数字,以便它们在超出范围时不会被剪裁。到目前为止,这就是我所拥有的

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语句,但如果绝对需要,也可以使用一个。这可能吗?

int循环(int-val,int-min,int-max)
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;
}
{ int p=最大最小值+1; int mod=(val min)%p;
如果(mod对不起。删除了以前的答案。请尝试以下答案:

((最小值)%(最小值最大值)+最小值最大值)%(最小值最大值)+最小值


编辑:如果希望最大值是一个有效值,而不是溢出到最小值,请在所有3个位置将最大值替换为最大值+1。

从数学上讲,您应该能够执行以下操作:

((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

我认为你的最后一个例子应该是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。对不起。RE:Mehrdad Afshari。老实说,我不知道我写这篇文章的时候在想什么。你绝对正确。91应该是10来做一个正确的循环。9应该是90分,8分是89分。我真的很抱歉,伙计们,我一直在给你们错误的方向。为什么不从
if(val==max)开始呢return max;
?非常抱歉。自从我的循环逻辑出错以来,我一直在误导你。你之前注意到了,但我直到现在都不太明白。91应该是10,而不是11。9应该变成90,以此类推,以使循环正确。谁使用两个除法而不是一个除法?:)此外,90将变成10。对不起,帕维尔,我编辑了我的问题,因为我的循环逻辑被搞糊涂了。@rotsor:int模(int x,int y){int-answer=x%y;返回答案<0?答案+std::abs(y):答案;}这正是我和帕维尔正在做的事情,但你的解决方案没有检查valRe-rotsor:这应该可以解决它。