制作类似于模的函数,该函数也可用于负数

问题描述

我需要制作一个函数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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...