为了账号安全,请及时绑定邮箱和手机立即绑定

Mod为负数正在融化我的大脑

Mod为负数正在融化我的大脑

蛊毒传说 2019-10-05 15:16:13
我正在尝试修改一个整数以获取数组位置,以便它将循环。i % arrayLength对于正数,这样做很好,但对于负数,一切都会出错。 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所以我需要一个实现int GetArrayIndex(int i, int arrayLength)这样GetArrayIndex( 4, 3) == 1GetArrayIndex( 3, 3) == 0GetArrayIndex( 2, 3) == 2GetArrayIndex( 1, 3) == 1GetArrayIndex( 0, 3) == 0GetArrayIndex(-1, 3) == 2GetArrayIndex(-2, 3) == 1GetArrayIndex(-3, 3) == 0GetArrayIndex(-4, 3) == 2我以前做过,但是由于某种原因,今天它融化了我的大脑:(
查看完整描述

4 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

我总是使用自己的mod函数,定义为


int mod(int x, int m) {

    return (x%m + m)%m;

}

当然,如果您不愿意两次调用模数运算,可以将其写为


int mod(int x, int m) {

    int r = x%m;

    return r<0 ? r+m : r;

}

或其变体。


它起作用的原因是“ x%m”始终在[-m + 1,m-1]范围内。因此,如果完全为负,则将其添加到m会将其置于正范围内,而不会更改其模m值。


查看完整回答
反对 回复 2019-10-05
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

请注意,C#和C ++的%运算符实际上不是模数,而是余数。在您的情况下,所需的取模公式为:


float nfmod(float a,float b)

{

    return a - b * floor(a / b);

}

您必须使用C#(或C ++)重新编码,但这是获得模数而不是余数的方式。


查看完整回答
反对 回复 2019-10-05
?
心有法竹

TA贡献1866条经验 获得超5个赞

增加一些理解。


根据欧几里得的定义,模结果必须始终为正。


例如:


 int n = 5;

 int x = -3;


 int mod(int n, int x)

 {

     return ((n%x)+x)%x;

 }

输出:


 -1


查看完整回答
反对 回复 2019-10-05
  • 4 回答
  • 0 关注
  • 702 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信