我正在寻找一个模数运算符mqseries
,以便:
Mod(a,b,m)
Mod(2,6,7)=-3
也就是说,操作员避开2到6之间的4跳路径,而是通过长度为3的路径绕圈。如果从Mod(6,2,7)=3
离开并且转到{,答案会保留路径方向{1}}。
以下代码计算了这一点,但几乎肯定有更好的方法。
a
答案 0 :(得分:1)
您可以使用标准模数函数处理负数的方式,使其完成决定进入哪个方向的工作:
#include <cmath>
double ModDist(double s, double d, double m) {
return std::fmod((d - s) * 2, m) + s - d;
}
答案 1 :(得分:1)
数学库函数余数,顾名思义,在第一个参数除以第二个参数时返回余数。与fmod不同,它返回一个带符号的结果,实际上,余数(a,d)是绝对值的最小数r,这样a-r是d的整数倍。 你想要的是这适用于b-a,即:
double ModDist( double a, double b, double m)
{ return remainder( b-a, m);
}
答案 2 :(得分:0)
如果您的直接距离小于距离的一半,则通过另一种方式不会做得更好。相反,如果它大于距离的一半,你可以通过改变方向做得更好。
这假定为0<=src,dest<=m
double ModDist(double src, double dest, double m){
double directDistance = dest - src;
if(abs(directDistance)<m/2)
return directDistance;
return -(m - abs(directDistance))*sgn(directDistance);
}