如何解决制作类似于模的函数,该函数也可用于负数
我需要制作一个函数f(a,b)
,它将产生以下结果:
f(0,3) = 0
f(1,3) = 1
f(2,3) = 2
f(3,3) = 0
f(4,3) = 1... (this works exactly like a%b)
但是对于负数,也应遵循以下模式:
f(-4,3) = 2
f(-3,3) = 0
f(-2,3) = 1
f(-1,3) = 2
f( 0,3) = 0
我当前找到了此解决方案:
x = a % b
return a < 0 && mod != 0 ? mod + b : mod;
但是,对于我想要实现的目标而言,这感觉太复杂且太慢。是不是有一种更简单的方法来生成类似于对负值继续进行模运算的序列?
解决方法
模操作行为取决于编程语言-参见table here
例如,在Python中,print(-4 % 3)
给出了2
似乎您使用的是类似C的语言,其余的符号与除数相同。在这种情况下,您可以使用这样的公式(ideone)
(a % b + b) % b
唯一的比较也足以校正负值(因此避免双%
)
rem = a % b;
if (rem < 0) rem += b;
,
对于任何b
来说,这都不是通用的解决方案,但是如果您只需要从两侧包裹一个数组,并且将索引递减1(或最多a
),任何b >= -a
的有效且更短的解决方案是:
(a + b) % b
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。