首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >负数的模式正在融化我的大脑

负数的模式正在融化我的大脑
EN

Stack Overflow用户
提问于 2009-07-05 04:22:44
回答 9查看 124.4K关注 0票数 222

我试图对一个整数进行mod,以获得一个数组位置,这样它就会循环。对于正数来说,执行i % arrayLength工作得很好,但是对于负数,这一切都是错误的。

代码语言:javascript
复制
 4 % 3 == 1
 3 % 3 == 0
 2 % 3 == 2
 1 % 3 == 1
 0 % 3 == 0
-1 % 3 == -1
-2 % 3 == -2
-3 % 3 == 0
-4 % 3 == -1

所以我需要一个实现

代码语言:javascript
复制
int GetArrayIndex(int i, int arrayLength)

这样的话

代码语言:javascript
复制
GetArrayIndex( 4, 3) == 1
GetArrayIndex( 3, 3) == 0
GetArrayIndex( 2, 3) == 2
GetArrayIndex( 1, 3) == 1
GetArrayIndex( 0, 3) == 0
GetArrayIndex(-1, 3) == 2
GetArrayIndex(-2, 3) == 1
GetArrayIndex(-3, 3) == 0
GetArrayIndex(-4, 3) == 2

我以前也这样做过,但由于某种原因,今天它让我的大脑融化了:

EN

回答 9

Stack Overflow用户

发布于 2011-06-19 12:07:56

请注意,C#和C++的%运算符实际上不是模数,而是余数。在你的例子中,你需要的模数公式是:

代码语言:javascript
复制
float nfmod(float a,float b)
{
    return a - b * floor(a / b);
}

你必须用C# (或C++)重新编码,但这是你得到模数而不是余数的方法。

票数 96
EN

Stack Overflow用户

发布于 2014-04-22 16:27:51

只使用一次%的单行实现:

代码语言:javascript
复制
int mod(int k, int n) {  return ((k %= n) < 0) ? k+n : k;  }
票数 20
EN

Stack Overflow用户

发布于 2018-06-25 15:49:54

比较两个主要答案

代码语言:javascript
复制
(x%m + m)%m;

代码语言:javascript
复制
int r = x%m;
return r<0 ? r+m : r;

没有人真正提到第一个答案可能会抛出OverflowException,而第二个答案不会。更糟糕的是,在默认未检查上下文的情况下,第一个答案可能会返回错误的答案(例如参见mod(int.MaxValue - 1, int.MaxValue) )。因此,第二个答案不仅看起来更快,而且更正确。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1082917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档